Pandas groupby apply agg 区别 运行自定义函数

agg 方法将一个函数使用在一个数列上,然后返回一个标量的值。也就是说agg每次传入的是一列数据,对其聚合后返回标量。
对一列使用三个函数:
Pandas groupby apply agg 区别 运行自定义函数_第1张图片
对不同列使用不同函数
Pandas groupby apply agg 区别 运行自定义函数_第2张图片
apply 是一个更一般化的方法:将一个数据分拆-应用-汇总。而apply会将当前分组后的数据一起传入,可以返回多维数据。
Pandas groupby apply agg 区别 运行自定义函数_第3张图片
图片来自
实例:
1、数据如下:

lawsuit2[['EID','LAWAMOUNT','LAWDATE']]

Pandas groupby apply agg 区别 运行自定义函数_第4张图片
2、groupby后应用apply传入函数数据如下:

lawsuit2[['EID','LAWAMOUNT','LAWDATE']].groupby(['EID']).apply(lambda df:print(df))

Pandas groupby apply agg 区别 运行自定义函数_第5张图片
3、如果使用agg,对于两列可以处理,但对于上面的三列,打印数据如下:

lawsuit2[['EID','LAWAMOUNT','LAWDATE']].groupby(['EID']).agg(lambda df:print(df))

Pandas groupby apply agg 区别 运行自定义函数_第6张图片
可以看到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:
        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()

你可能感兴趣的:(machine,learning)