数据聚合除了GroupBy.mean()的聚合方法外,另一种直观的方法是直接接在GroupBy对象之后;
例:
>>> import pandas as pd
>>> df = pd.read_excel('./input/class.xlsx')
>>> df
class sex score_math score_music
0 A male 95 79
1 A female 96 90
2 B female 85 85
3 C male 93 92
4 B female 84 90
5 B male 88 70
6 C male 59 89
7 A male 88 86
8 B male 89 74
#先对其进行GroupBy操作
>>> grouped = df.groupby('class')
#以下两种方式的结果完全相同
>>> grouped.sum()
score_math score_music
class
A 279 255
B 346 319
C 152 181
>>> grouped.agg('sum')
score_math score_music
class
A 279 255
B 346 319
C 152 181
可以同时使用多个聚合函数(使用列表的格式),其结果将包含一个层次化索引,新加的索引名称是函数的名称。
>>> grouped.agg([np.sum,np.mean])
score_math score_music
sum mean sum mean
class
A 279 93.0 255 85.00
B 346 86.5 319 79.75
C 152 76.0 181 90.50
数据聚合也可使用自定义聚合函数:自定义的函数必须具有聚合的作用,若传入一个一个数组(1维),必须只能返回标量值(0维)
需要注意的是:在构造中间分组数据块时可能存在函数调用、数据重排等较大的开销。
>>> grouped.agg([np.sum,lambda x:x.max()-x.min()])
score_math score_music
sum <lambda> sum <lambda>
class
A 279 8 255 11
B 346 5 319 20
C 152 34 181 3
在列表中传入一个二元元组(函数名,函数),可以更改列名;
>>> grouped.agg([('sum',np.sum),('range',lambda x:x.max()-x.min())])
score_math score_music
sum range sum range
class
A 279 8 255 11
B 346 5 319 20
C 152 34 181 3
对于不同的列执行不同的聚合运算,可以向agg()函数传入一个字典,将多个函数运用到至少一列时,聚合结果才会拥有层次化索引;
所以,在单独的运用一个函数时,若需要显示层次化索引,就可以使用列表的形式“假装”要对某一列运用多个聚合运算。
>>> map_func = {'score_math':[np.mean,np.max],'score_music':[np.mean,np.min]}
>>> grouped.agg(map_func)
score_math score_music
mean amax mean amin
class
A 93.0 96 85.00 79
B 86.5 89 79.75 70
C 76.0 93 90.50 89
#假装要对某一列进行多个聚合运算,以达到层次化索引的结果
>>> map_func = {'score_math':[np.max],'score_music':[np.min]}
>>> grouped.agg(map_func)
score_math score_music
amax amin
class
A 96 79
B 89 70
C 93 89