5-Pandas数据聚合(GroupBy.agg())
数据聚合除了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