一、Groupby分组
0.准备
df=pd.DataFrame({'key1':list('aabba'), 'key2':['one','two','one','two','one'], 'data1':np.random.randn(5),
people = pd.DataFrame(np.random.randn(5,5), columns = ['a','b','c','d','e'], index = ['Joe','Steve','Wes','Jim','Travis'])
'data2':np.random.randn(5)}) 1,X.groupby([Y,Z]).sum() 分组依据都在【】里面,YZ为长度相当的数组即可2,Groupby函数:sum,mean,size(计每组个数)3.分组迭代for(n1,n2),group in df.groupby(['key1','key2']) for name,group in df.groupby('key1'):
4.列分组聚合
a=dict(list(df.groupby(df.dtypes,axis=1)))
5.等价代码
a=df.groupby('key1')['data1'].sum() b=df['data1'].groupby(df['key1']).sum()
6.用字典分组
people = pd.DataFrame(np.random.randn(5,5), columns = ['a','b','c','d','e'], index = ['Joe','Steve','Wes','Jim','Travis'])
7.用函数分组mapping = {'a':'red','b':'red','c':'blue','d':'blue','e':'red','f':'orange'} a=people.groupby(mapping,axis=1).sum()
a=people.groupby([len,mapping]).sum()
8.用索引分组
b=a.groupby(level=1).count() c=a.groupby(level=1).size()
9.groupby的函数
sum,mean,
size(返回series),count(返回dataframe),使用level,0为最外层
二、数据聚合(agg)
1.用自定义函数聚合(如何自定义)
def peak(arr): return arr.max()-arr.min() a=df.groupby('key1').agg(peak)
2.用于全部列的多个函数a=df.groupby('key1').agg(peak,'mean','count')
可对其命名,传入由(name,func)组成的元组
这样得到的dataframe函数列名就改变了
fun=[('a',peak),('ha','mean'),('ad','count'),('ap','std')] a=df.groupby('key1').agg(fun)
3.用于不同列的不同函数
mun={'data1':['mean',peak,'size','sum'], 'data2':['count',peak,'std','var']} a=df.groupby('key1').agg(mun)
同样可以命名mun={'data1':[('a','mean'),('b',peak)], 'data2':[('c','count'),('d',peak)]} a=df.groupby('key1').agg(mun)
三、其他分组计算方法
1.transform
不改变元数据个数,同样分组,但是会返回值到元数据结构每个位置上
2.apply
应用更广泛,条件更宽泛,一般化的分组计算方法
def top(x,n=5,column='tip_pct'): return x.sort_index(by=column)[-n:] a=tips.groupby(['smoker','sex']).apply(top,column='tip',n=2)
禁止分组键:
a=tips.groupby(['smoker','sex'],group_keys=False).apply(top,column='tip',n=2)
注意:区分agg,transform,apply
agg 用于自定义 聚合函数
transform 会保持原数据结构,如5*4结构,算完还是5*4结构,而agg可能就是5*2结构了
apply 更宽泛的自自己构造函数
四,透视表与交叉表
1.x.pivot_table()
tips=pd.read_csv('ch08/tips.csv') a=tips.pivot_table('size',index=['sex','time','smoker'],columns='day',margins=True, aggfunc='sum',fill_value='hah')
各个参数:value 填充值index 行索引
columns 列索引
margins 添加all的行和列
aggfunc 函数,默认为‘mean’
fill_value 填充缺失值
2.pd.crosstab()
用于统计频数
data=pd.DataFrame({'sample':[1,2,3,4,5,6,7,8,9,10], 'gender':['female','male','female','male','male','male','female','female','male','female'], 'handedness':['right','left','right','right','left','right','right','left','right','right']}) a=pd.crosstab([data['gender'],data['sample']],data['handedness'],margins=True)
3.数据规整化中的x.pivot() 也差不多,只是放进去的是原数据
都是将宽格式转化为长格式