如何在pandas GroupBy agg中给内置函数传参以避免使用lambda
你可以通过给agg传入带参数的内置方法调用实现需求,pandas原生支持该用法,无需引入lambda或自定义函数,运行效率和直接调用内置聚合函数一致。
前置注意事项
在计算前请先确保数据集已经按交易日期排序,避免取到错误的位置:
# 按用户+交易日期升序排序,保证顺序正确 df = df.sort_values(['user_id', 'order_date']).reset_index(drop=True)
实现代码
写法1:直接传入参数(无需额外导入)
pandas支持在agg的聚合规则位置传入(方法名, 位置参数)的元组,自动将参数传递给对应内置方法:
res = df.groupby('user_id').agg( # 交易笔数:直接用内置size方法 count=('user_id', 'size'), # 倒数第二笔日期:给nth方法传入负索引n=-2,对应倒数第二个元素 last2date=('order_date', ('nth', -2)), # 平均交易金额:直接用内置mean方法,默认跳过空值 avgprice=('item_price', 'mean') ).reset_index()
写法2:用functools.partial绑定参数
如果需要传入关键字参数,也可以用partial预绑定方法参数:
from functools import partial res = df.groupby('user_id').agg( count=('user_id', 'size'), last2date=('order_date', partial(pd.core.groupby.GroupBy.nth, n=-2, dropna='any')), avgprice=('item_price', 'mean') ).reset_index()
补充说明
- 如果部分用户的交易笔数不足2笔,
nth(-2)会自动返回NaN,你可以根据需求后续调用dropna过滤这类记录。 - 你提到的tail方法也可以用同样的逻辑传参,比如要取每组倒数第2到最后一条记录,传入
('tail', 2)即可。
内容的提问来源于stack exchange,提问作者camel_case
相关产品推荐
相关产品推荐

