數據聚合除了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
