pandas分组聚合运算groupby之agg,apply,transform

     

目录

一、agg和transform

二、agg和apply

三、其他注意点

       groupby函数是pandas中用以分组的函数,可以通过指定列来进行分组,并返回一个GroupBy对象。对于GroupBy对象的聚合运算,其有经过优化的较为常用的sum,mean等函数,但是如果我们需要用自定义的函数进行聚合运算,那么就需要通过agg,apply,transform来实现。

       agg,apply和transform三者之间的区别在于:1、agg和transform之间的区别为:前者经过聚合后,只会在该组单列中返回一个标量值,而transform则会将该标量值在该组单列内进行广播,保持原DataFrame的索引不变;2、agg和transform中的函数参数是以分组后的单列(Series)为操作对象的,即传入agg和transform的函数的参数是列,而apply中的函数参数是分组后整个的DataFrame。下面分别对这两点进行说明。

一、agg和transform

       如下代码所示,构造一个df,agg和transform中lambda函数的input都为单列,但是agg返回的索引是分组的key的唯一值,而transform返回的索引和原df一样,但是相比于agg返回的结果,发现transform只是在d行处的值进行了重复的广播,这个目的就是维持原df的索引不变,且被拿来分组的列会被剔除。

df
Out[1]:
  index  a  b  c
0     d  0  1  2
1     d  3  4  5
2     e  6  7  8

df.groupby(by='index').agg(lambda x:x.shape)
Out[2]: 
          a     b     c
index                  
d      (2,)  (2,)  (2,)
e      (1,)  (1,)  (1,)

df.groupby(by='index').transform(lambda x:x.shape)
Out[3]: 
      a     b     c
0  (2,)  (2,)  (2,)
1  (2,)  (2,)  (2,)
2  (1,)  (1,)  (1,) 

二、agg和apply

       下面的是apply的结果,相比于上面agg的结果,可以发现,实际上lambda函数的input不再是一个Series,而是分组后的整个DataFrame。

dd.groupby(by='index').apply(lambda x:x.shape)
Out[4]: 
index
d    (2, 4)
e    (1, 4)

三、其他注意点

       对于agg函数,其不仅可以传入一个函数对每列执行相同的操作,还可以传入一个字典{'col_name':func},来对不同的列做不同的操作,也可以将func替换为由多个不同的函数组成的list,实现对同一列做多个不同的操作,这是agg函数最为灵活的地方。

       这三个函数,参数形式都为(func, *args,**kwargs),所以可以通过位置参数和关键字参数给func传递额外的参数。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值