• 售前

  • 售后

热门帖子
入门百科

Pandas groupby apply agg 的区别 运行自界说函数阐明

[复制链接]
为林羽而来亩 显示全部楼层 发表于 2021-10-26 14:07:50 |阅读模式 打印 上一主题 下一主题
agg 方法将一个函数使用在一个数列上,然后返回一个标量的值。也就是说agg每次传入的是一列数据,对其聚合后返回标量。
对一列使用三个函数:


对不同列使用不同函数


apply 是一个更一般化的方法:将一个数据分拆-应用-汇总。而apply会将当前分组后的数据一起传入,可以返回多维数据。

实例:

1、数据如下:
  1. lawsuit2[['EID','LAWAMOUNT','LAWDATE']]
复制代码
2、groupby后应用apply传入函数数据如下:
  1. lawsuit2[['EID','LAWAMOUNT','LAWDATE']].groupby(['EID']).apply(lambda df:print(df))
复制代码
3、如果使用agg,对于两列可以处置惩罚,但对于上面的三列,打印数据如下:
  1. lawsuit2[['EID','LAWAMOUNT','LAWDATE']].groupby(['EID']).agg(lambda df:print(df))
复制代码
可以看到agg传入的只有一列数据,如果我们使用df加列下表强行取值也能取到,但是偶然会出现各种keyError题目。
4、完备代码:

判断近来一次日期的花费是否是全部的花费中最大花费。
  1. def handle(df):
  2. #   print(df)
  3. # 找最大日期
  4.   maxdate = df['LAWDATE'].max()
  5. # 找最大费用
  6.   left = df[ df['LAWDATE']==maxdate ]['LAWAMOUNT'].max()
  7. # 取ID
  8.   EID = df['EID'].values[0]
  9. #   print(EID)
  10. # 从已存在的表中根据EID找到最大费用
  11.   right = LAW_AMOUNT_MAX.loc[EID,'LAW_AMOUNT_MAX']
  12. # 判断费用是否相等
  13.   if left==right:
  14.     return 1
  15.   else:
  16.     return 0
  17.    
  18. LAW_AMOUNT_MAX_IS_LAST = lawsuit2[['EID','LAWAMOUNT','LAWDATE']].groupby(['EID']).apply(handle)
复制代码
其他注意点:
在groupby后使用apply,如果直接返回,会出现有多余的groupby索引题目,可以使用group_keys办理:
  1. orgin = reviews_df.sort_values(["reviewerID","unixReviewTime"]).groupby("reviewerID",group_keys=False)
  2. train = orgin.apply(lambda df: df[:-2])
  3. train.head()
复制代码
增补:pandas分组聚合运算groupby之agg,apply,transform
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的索引稳固,且被拿来分组的列会被剔除。
  1. df
  2. Out[1]:
  3. index a b c
  4. 0   d 0 1 2
  5. 1   d 3 4 5
  6. 2   e 6 7 8
  7. df.groupby(by='index').agg(lambda x:x.shape)
  8. Out[2]:
  9.      a   b   c
  10. index         
  11. d   (2,) (2,) (2,)
  12. e   (1,) (1,) (1,)
  13. df.groupby(by='index').transform(lambda x:x.shape)
  14. Out[3]:
  15.    a   b   c
  16. 0 (2,) (2,) (2,)
  17. 1 (2,) (2,) (2,)
  18. 2 (1,) (1,) (1,)
复制代码
二、agg和apply

下面的是apply的效果,相比于上面agg的效果,可以发现,现实上lambda函数的input不再是一个Series,而是分组后的整个DataFrame。
  1. dd.groupby(by='index').apply(lambda x:x.shape)
  2. Out[4]:
  3. index
  4. d  (2, 4)
  5. e  (1, 4)
复制代码
三、其他注意点

对于agg函数,其不仅可以传入一个函数对每列实行雷同的操纵,还可以传入一个字典{'col_name':func},来对不同的列做不同的操纵,也可以将func更换为由多个不同的函数构成的list,实现对同一列做多个不同的操纵,这是agg函数最为机动的地方。
这三个函数,参数形式都为(func, *args,**kwargs),所以可以通过位置参数和关键字参数给func传递额外的参数。
以上为个人履历,盼望能给大家一个参考,也盼望大家多多支持草根技术分享。如有错误或未考虑完全的地方,望不吝赐教。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作