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

如何在Pandas中实现支持任意分组变量数量的分组求和自定义函数?

实现支持任意数量分组变量的分组求和函数

你完全可以通过Python的可变位置参数来实现这个泛化版本,不用再为不同数量的分组变量写重复的函数啦。

最终泛化函数

def grp_and_sum(data, sum_var, *grp_vars):
    # 将可变参数转为列表传给groupby
    grouped = data.groupby(list(grp_vars))[sum_var].sum()
    return grouped

核心原理

这里的*grp_vars是Python的可变位置参数语法——它会把你传入的所有分组变量参数自动打包成一个元组,我们只需要把这个元组转换成列表(pandas的groupby既接受列表也接受元组),就能直接用于分组操作了。

用法示例

先用上你提供的测试DataFrame:

import pandas as pd

df = pd.DataFrame({ 
    'cat_1': ['A'] * 3 + ['B'] * 3, 
    'cat_2': ['x', 'y', 'z'] * 2, 
    'value': [1, 2, 3, 4, 5, 6] 
})

1. 单个分组变量(对应你原来的grp_and_sum)

grp_and_sum(df, 'value', 'cat_1')

输出结果:

cat_1
A     6
B    15
Name: value, dtype: int64

2. 两个分组变量(对应你原来的grp_and_sum_2)

grp_and_sum(df, 'value', 'cat_1', 'cat_2')

输出结果:

cat_1  cat_2
A      x        1
       y        2
       z        3
B      x        4
       y        5
       z        6
Name: value, dtype: int64

3. 更多分组变量(如果有需要)

假设你的DataFrame新增了第三列分类列cat_3:

df['cat_3'] = ['foo', 'bar', 'foo'] * 2
grp_and_sum(df, 'value', 'cat_1', 'cat_2', 'cat_3')

同样能正常返回按三个维度分组求和的结果。

参数顺序小说明

我把sum_var调整到了*grp_vars前面,这是因为可变参数必须放在位置参数的后面。如果你更习惯原来的参数顺序,也可以改用关键字参数强制指定sum_var,写法如下:

def grp_and_sum(data, *grp_vars, sum_var):
    grouped = data.groupby(list(grp_vars))[sum_var].sum()
    return grouped

# 调用时必须显式指定sum_var
grp_and_sum(df, 'cat_1', sum_var='value')

不过第一种写法调用起来更符合直觉,和你原来的函数使用习惯更接近~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:20:09