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

  

 

posted @ 2020-08-07 12:10  大脸猫12581  阅读(791)  评论(0编辑  收藏  举报