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
相关产品推荐
相关产品推荐

