apply():用于对DataFrame中的数据进行按行或者按列操作
map():用于对Series中的每一个数据操作
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(4, 3), columns=list('bcd'), index=['sz', 'sh', 'bj', 'hn'])
print(df)
print('*' * 8)
d1 = df.apply(np.sum, axis=1) # axis=0 是纵向; =1 是横向
print(d1)
print(df.idxmax()) # 获取最大值对应的标签索引
print(df.idxmin()) # 获取最大、小值对应的标签索引
print('*' * 8)
# 自定义函数来进行映射
f = lambda x: x.max() - x.min()
print(df.apply(f, axis=1)) # 横向最大最小相减
# 返回每一列的最大最小值
def func1(x):
return pd.Series([x.min(), x.max()], index=['min', 'max'])
print(df.apply(func1))
s = pd.Series(['ap', 'ban', 'org', 'pea'])
price = {'ap': 5, 'org': 3}
print(s.map(price))
# 数据处理
# np.dropna()
a = np.ones((6, 5))
print(a)
for i in range(len(a)):
a[i, :i] = np.nan
d = pd.DataFrame(data=a)
print(d)
print(d.dropna()) # 默认是any 只要有空值就删除
print(d.dropna(how='all')) # 只有全部为空值的才删除 axis=0 表示删除行 axis=1表示删除列 (相反的 lol...)
#空值打的处理办法有两种 删除 或 填充
# 空值填充
print(d.fillna(2)) # 将空值填充为2
# 每列填充不同的值
e = d.fillna({0: 10, 1: 20, 3: 30})
print(e) # 第一列填充10 第二列填充20 第三列填30
# 差值方式
print(e.fillna(method='ffill')) # 填充上面的值
# 去重
e1 = pd.DataFrame({'A': [1, 1, 1, 3, 3, 3, 2, 2, 2], 'B': list('aabbbbccc')})
print(e1.drop_duplicates()) # 删除内容一样的行
print(e1.drop_duplicates('A')) # 针对A例删除
e2 = pd.DataFrame({'k1': list('abc'), 'k2': ['h', np.nan, '123']})
print(e2)
# 把k1变成大写
e2['k3'] = e2['k1'].str.upper()
print(e2)
e3 = pd.DataFrame(np.random.randn(3, 2), columns=['c-A', 'c-B'], index=list('abc'))
print(e3)
e3.columns = e3.columns.str.replace('-', '')
print(e3)
e4 = pd.DataFrame({'k1': ['a-b-c', '1-2-3']})
print(e4)
e4[['k3', 'k4', 'k5']] = e4['k1'].str.split('-', expand=True)
print(e4)
print(e4['k1'].str[0]) # 取k1列的数据的第一个元素
e5 = pd.DataFrame({'name': ['lili le', 'tom mao', 'tonny ma']})
e5['firstname'] = e5['name'].str.split(' ').str[0].str.capitalize() # 取出firstname 并且首字母大写
print(e5)
#分组聚合
e6=pd.DataFrame({'name':['boss','lili','boss','lili','han','han','boss'],
'year':[2020,2021,2021,2020,2021,2020,2021],
'salary':[9999,8888,6666,7777,9811,6869,8987]})
print(e6)
print(e6.groupby('name').count()) #根据名字分组 求出现的次数
print(e6.groupby(['name', 'year']).sum()) #根据名字和年度分组 求出每年发了多少钱