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

如何在groupby.agg()中为多个函数传递参数?

在pandas的groupby.agg()中为函数传递参数的方法

这个问题其实在pandas里挺常见的,尤其是当你需要对分组后的数据应用带参数的函数(不管是内置的还是自定义的)时。我来给你一步步拆解,先从你提到的quantile函数入手,再延伸到自定义函数的情况。

1. 用lambda函数包裹带参数的内置函数

quantile函数需要指定分位数参数q(比如0.25代表四分位数),直接在agg()里写'quantile'会报错,因为它缺少必要的参数。这时候用lambda函数来包裹,就能把参数传递进去:

首先构造一个示例数据:

import pandas as pd

df = pd.DataFrame({
    'Group': ['A', 'A', 'B', 'B', 'B', 'C'],
    'Value': [10, 20, 15, 25, 35, 50]
})

然后用lambda传递quantile的参数:

# 按Group分组后,计算Value列的0.25分位数
result = df.groupby('Group')['Value'].agg(lambda x: x.quantile(q=0.25))
print(result)

输出结果会是每个分组对应的25%分位数:

Group
A    15.0
B    20.0
C    50.0
Name: Value, dtype: float64

2. 为多个带参数函数命名(更清晰的结果列)

如果需要对同一列应用多个带参数的函数(比如同时计算25%和75%分位数),可以用关键字参数或者元组列表的方式给结果列命名,让输出更直观:

result_multi = df.groupby('Group')['Value'].agg(
    Q25=lambda x: x.quantile(0.25),  # 命名为Q25
    Q75=lambda x: x.quantile(0.75),  # 命名为Q75
    Mean='mean'  # 同时混用无参数的内置函数
)
print(result_multi)

输出会是一个多列的DataFrame:

Q25   Q75       Mean
Group
A     15.0  17.5  15.000000
B     20.0  30.0  25.000000
C     50.0  50.0  50.000000

3. 自定义函数传递参数

对于你提到的自定义函数,逻辑和内置函数完全一致——用lambda或者functools.partial来绑定参数。比如我们定义一个自定义函数,计算分组中大于某个阈值的数值的平均值:

# 自定义函数:接收数据列和阈值参数
def above_threshold_mean(x, threshold):
    return x[x > threshold].mean()

然后在agg()中通过lambda传递参数:

result_custom = df.groupby('Group')['Value'].agg(
    avg_above_20=lambda x: above_threshold_mean(x, threshold=20),
    avg_above_30=lambda x: above_threshold_mean(x, threshold=30)
)
print(result_custom)

输出结果:

avg_above_20  avg_above_30
Group
A               NaN           NaN
B              30.0          35.0
C              50.0          50.0

如果你觉得重复写lambda麻烦,可以用functools.partial来固定参数,让代码更简洁:

from functools import partial

# 固定threshold为20,生成一个新的函数
avg_above_20 = partial(above_threshold_mean, threshold=20)

# 直接在agg中使用这个固定参数的函数
result_partial = df.groupby('Group')['Value'].agg(avg_above_20=avg_above_20)
print(result_partial)

核心总结

不管是内置函数还是自定义函数,在groupby.agg()中传递参数的核心思路就是:

  • 用lambda函数作为中间层,把参数传递给目标函数
  • 或者用functools.partial预先固定函数的参数,再传入agg()

这样就能灵活地在分组聚合中使用各种带参数的函数了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:59:58