如何在Pandas分组聚合中传递多列与参数调用自定义函数
解决方案
首先得把maxx函数的逻辑补全,否则无法执行:
def maxx(x, y, take_higher): max_x = x.max() max_y = y.max() return max(max_x, max_y) if take_higher else min(max_x, max_y)
下面提供两种可行的实现方式:
方式一:使用groupby.apply
这种方式能直接获取每个分组的完整DataFrame,手动指定x、y列传入绑定好参数的函数:
from functools import partial import pandas as pd # 绑定take_higher参数,生成两个专用函数 maxx_higher = partial(maxx, take_higher=True) maxx_lower = partial(maxx, take_higher=False) df = pd.DataFrame({'cat': [0, 1, 0, 0, 0, 1, 0, 0, 0, 0], 'x': [10, 15, 5, 11, 0, 4.3, 5.1, 8, 10, 12], 'y': [1, 3, 5, 1, 0, 4.3, 1, 0, 2, 2], 'z': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] }) # 分组后应用函数,将结果整理为DataFrame格式 result = df.groupby('cat').apply( lambda group: pd.Series( [maxx_higher(group['x'], group['y']), maxx_lower(group['x'], group['y'])], index=['take_higher_true', 'take_higher_false'] ) ) print(result)
方式二:使用groupby.agg的字典映射
如果偏好agg写法,可以通过匿名函数包装,让函数能接收整个分组并提取x、y列:
# 绑定take_higher参数 maxx_higher = partial(maxx, take_higher=True) maxx_lower = partial(maxx, take_higher=False) # 用agg实现自定义计算逻辑,直接映射结果列名 result = df.groupby('cat').agg( take_higher_true=lambda g: maxx_higher(g['x'], g['y']), take_higher_false=lambda g: maxx_lower(g['x'], g['y']) ) print(result)
原写法失败的原因
你之前的代码有两个核心问题:
- 函数名写错了,定义的是
maxx却写成了mmax agg默认是对单列操作,而你的maxx需要同时接收x、y两列,直接传递partial函数会导致参数不匹配(agg会把单列数据传入,无法满足函数对两个列参数的要求)
内容的提问来源于stack exchange,提问作者Petar Ulev
相关产品推荐
相关产品推荐

