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

如何在Pandas的groupby聚合中向自定义函数传递组名?

解决Pandas自定义聚合函数获取组名的问题

我太懂这个痛点了——当你需要写一个依赖当前组信息的自定义聚合函数时,aggregate()(或简写agg())默认只给你传入对应列的Series,完全拿不到组名,这确实让人挠头。

你提到的把分组列添加到索引里的方法是可行的,我来给你拆解具体操作,另外再分享一个更灵活的替代方案:

方法1:将分组列设置为索引

假设你有这样的示例DataFrame:

import pandas as pd

df = pd.DataFrame({
    'Group': ['A', 'A', 'B', 'B'],
    'Value': [10, 20, 30, 40]
})

要让聚合函数拿到组名,你可以先把分组列设为索引,再进行分组聚合:

# 把分组列转为索引
df_indexed = df.set_index('Group')

# 自定义聚合函数,从Series索引中提取组名
def custom_agg(series):
    # 同一组的索引值都是相同的组名,取第一个即可
    group_name = series.index[0]
    return f"Group {group_name} 总和: {series.sum()}"

# 按索引层级分组并执行聚合
result = df_indexed.groupby(level='Group')['Value'].agg(custom_agg)

执行后会得到包含组名的聚合结果:

Group
A    Group A 总和: 30
B    Group B 总和: 70
Name: Value, dtype: object

方法2:用apply()替代agg()

其实还有个更省心的方法——使用GroupBy.apply(),它会把每个组的完整DataFrame传给你的函数,你可以直接通过group.name拿到组名,不需要折腾索引:

def custom_apply(group):
    group_name = group.name
    return f"Group {group_name} 总和: {group['Value'].sum()}"

result = df.groupby('Group').apply(custom_apply)

这个方法的优势是不用修改原DataFrame结构,还能直接访问组内的所有列,适合更复杂的聚合场景。唯一要注意的是,apply()的性能略逊于agg(),如果数据量特别大,索引法会更高效;但中等数据量下,apply()的可读性和灵活性会更好。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:59:13