You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)

原写法失败的原因

你之前的代码有两个核心问题:

  1. 函数名写错了,定义的是maxx却写成了mmax
  2. agg默认是对单列操作,而你的maxx需要同时接收x、y两列,直接传递partial函数会导致参数不匹配(agg会把单列数据传入,无法满足函数对两个列参数的要求)

内容的提问来源于stack exchange,提问作者Petar Ulev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 04:50:40