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