Pandasgroupbyapplyagg的区别运⾏⾃定义函数说明agg ⽅法将⼀个函数使⽤在⼀个数列上,然后返回⼀个标量的值。也就是说agg每次传⼊的是⼀列数据,对其聚合后返回标量。对⼀列使⽤三个函数:
对不同列使⽤不同函数
apply 是⼀个更⼀般化的⽅法:将⼀个数据分拆-应⽤-汇总。⽽apply会将当前分组后的数据⼀起传⼊,可以返回多维数据。
实例:
1、数据如下:
lawsuit2[['EID','LAWAMOUNT','LAWDATE']]
2、groupby后应⽤apply传⼊函数数据如下:
lawsuit2[['EID','LAWAMOUNT','LAWDATE']].groupby(['EID']).apply(lambda df:print(df))
3、如果使⽤agg,对于两列可以处理,但对于上⾯的三列,打印数据如下:
lawsuit2[['EID','LAWAMOUNT','LAWDATE']].groupby(['EID']).agg(lambda df:print(df))
可以看到agg传⼊的只有⼀列数据,如果我们使⽤df加列下表强⾏取值也能取到,但是有时会出现各种keyError问题。
4、完整代码:
判断最近⼀次⽇期的花费是否是所有的花费中最⼤花费。
def handle(df):
#  print(df)
# 最⼤⽇期
maxdate = df['LAWDATE'].max()
# 最⼤费⽤
left = df[ df['LAWDATE']==maxdate ]['LAWAMOUNT'].max()
# 取ID
EID = df['EID'].values[0]
#  print(EID)
# 从已存在的表中根据EID到最⼤费⽤
right = LAW_AMOUNT_MAX.loc[EID,'LAW_AMOUNT_MAX']
# 判断费⽤是否相等
if left==right:
return 1
else:
groupby是什么函数
return 0
LAW_AMOUNT_MAX_IS_LAST = lawsuit2[['EID','LAWAMOUNT','LAWDATE']].groupby(['EID']).apply(handle)
其他注意点:
在groupby后使⽤apply,如果直接返回,会出现有多余的groupby索引问题,可以使⽤group_keys解决:
orgin = reviews_df.sort_values(["reviewerID","unixReviewTime"]).groupby("reviewerID",group_keys=False)
train = orgin.apply(lambda df: df[:-2])
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的索引不变,且被拿来分组的列会被剔除。
df
Out[1]:
index a b c
0  d 0 1 2
1  d 3 4 5
2  e 6 7 8
Out[2]:
a  b  c
index
d  (2,) (2,) (2,)
e  (1,) (1,) (1,)
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。
Out[4]:
index
d  (2, 4)
e  (1, 4)
三、其他注意点
对于agg函数,其不仅可以传⼊⼀个函数对每列执⾏相同的操作,还可以传⼊⼀个字典{'col_name':func},来对不同的列做不同的操作,也可以将func替换为由多个不同的函数组成的list,实现对同⼀列做多个不同的操作,这是agg函数最为灵活的地⽅。
这三个函数,参数形式都为(func, *args,**kwargs),所以可以通过位置参数和关键字参数给func传递额外的参数。
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。如有错误或未考虑完全的地⽅,望不吝赐教。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。