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

如何向pandas groupby的apply方法传入参数列表?

解决方案

要实现你想要的结果,核心思路是遍历参数列表中的每个参数,分别执行groupby.apply,再将所有结果按参数层级合并。直接给apply传参数列表是行不通的,因为apply是针对每个分组执行一次函数,而我们需要每个参数都对所有分组跑一遍逻辑。

步骤拆解

  1. 修正原函数的小问题:你的func_apply里np.random(3)会报错,应该改成np.random.random(3)(或者np.rand(3))来生成0-1之间的随机数。
  2. 遍历参数并生成子结果:对每个参数param,执行groupby.apply(func_apply, param=param),得到对应参数下的分组结果。
  3. 合并结果并添加层级索引:用pd.concat把所有子结果合并,通过keys参数指定每个子结果对应的参数值,同时设置names来命名多层索引的层级。

完整代码示例

import pandas as pd
import numpy as np

# 生成原始DataFrame
df = pd.DataFrame(np.random.random_sample((5,5)))
df["col"] = ["A", "B", "C", "A" ,"B"]

# 修正后的函数
def func_apply(df_group, param=1):
    return pd.Series(np.random.random(3)*param, name=str(param))

# 参数列表
params = [1,2,10]

# 遍历参数,生成每个参数对应的结果,再合并
result = pd.concat(
    [df.groupby('col').apply(func_apply, param=p) for p in params],
    keys=params,
    names=['par', 'col']
)

print(result)

输出效果

运行后会得到你期望的多层索引格式:

0         1         2
par col
1   A   0.123456  0.789012  0.345678
    B   0.901234  0.567890  0.234567
    C   0.890123  0.456789  0.678901
2   A   0.246912  1.578024  0.691356
    B   1.802468  1.135780  0.469134
    C   1.780246  0.913578  1.357802
10  A   1.234560  7.890120  3.456780
    B   9.012340  5.678900  2.345670
    C   8.901230  4.567890  6.789010

补充说明

  • 这里用pd.concat的keys参数自动为每个子结果添加了顶层索引par,完美匹配你想要的结构。
  • 如果你的func_apply逻辑更复杂,这个方法同样适用,只要保证每个参数对应的返回结果结构一致即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:53:13