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

pandas中groupby后如何对多列聚合同时计算sum与count

问题场景

需要按指定列对数据集分组汇总,同时对目标列计算求和(sum)、计数(count)结果,要求单行代码实现,不使用merge等额外合并操作。
已知单列求和实现代码:

summary = df.groupby(['country','item', "date", 'msgtype'], as_index=False)['size', 'turnover'].sum()

尝试的错误写法:

summary = df.groupby(['country','item', "date", 'order'], as_index=False).agg({(['size', 'weight']) : ['sum' , 'count']})

运行报错:

unhashable type: 'list'
错误原因

pandas的.agg()方法接收字典格式参数时,要求字典的key必须是可哈希的单个列名(字符串类型),不能直接将列名列表作为字典key——列表属于不可哈希类型,无法作为字典键使用,因此触发报错。

正确实现方案

以下三种写法都可以单行实现需求,无需额外合并操作:

  • 写法1:选列后直接传聚合函数列表(代码最短,输出多级列名)
summary = df.groupby(['country','item', "date", 'order'], as_index=False)[['size', 'weight']].agg(['sum', 'count'])

注意:选列时使用双层方括号[['size', 'weight']]传入列名列表,避免pandas解析歧义。

  • 写法2:字典格式正确传参(和写法1效果一致,输出多级列名)
    把每个需要聚合的列名单独作为字典key,对应值传入要计算的聚合函数列表即可,修正之前的字典写法错误:
summary = df.groupby(['country','item', "date", 'order'], as_index=False).agg({'size': ['sum', 'count'], 'weight': ['sum', 'count']})
  • 写法3:命名聚合(推荐,输出扁平化自定义列名)
    如果需要单层级的直观列名,方便后续数据处理,用pandas原生命名聚合语法,输出列名可自定义,无多级索引:
summary = df.groupby(['country','item', "date", 'order'], as_index=False).agg(size_sum=('size','sum'), size_count=('size','count'), weight_sum=('weight','sum'), weight_count=('weight','count'))

该写法输出的列直接对应分组列 + size_sum、size_count、weight_sum、weight_count,不需要额外做列名折叠处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 21:30:23