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

Pandas按列表列分组求和报错:如何合并列表列并汇总Count?

解决Pandas中按列表列分组求和的TypeError问题

我懂你遇到的麻烦了——直接用groupby('List')会报错,核心原因是列表属于不可哈希(unhashable)的可变类型,而Pandas的分组操作要求分组键必须是可哈希的(比如字符串、元组这类不可变类型)。下面给你几个实用的解决办法:

方法1:将列表转为元组(最常用方案)

把List列里的列表转换成元组(元组是不可变、可哈希的),之后再进行分组求和,最后可以按需转回列表:

import pandas as pd

df = pd.DataFrame({'List': [['once', 'upon'], ['once', 'upon'], ['a', 'time'], ['there', 'was'], ['a', 'time']], 'Count': [2, 3, 4, 1, 2]})

# 把列表转成元组作为临时分组键
df['List_tuple'] = df['List'].apply(tuple)
# 分组求和后重置索引,再把元组转回列表
result = df.groupby('List_tuple')['Count'].sum().reset_index()
result['List'] = result['List_tuple'].apply(list)
# 清理临时列,调整列顺序到预期格式
result = result.drop('List_tuple', axis=1)[['Count', 'List']]

print(result)

运行后就能得到你想要的结果:

Count           List
0      6     [a, time]
1      5  [once, upon]
2      1  [there, was]

方法2:使用groupby的key参数(Pandas 1.3.0+适用)

如果你用的是Pandas 1.3.0及以上版本,可以直接在groupby里指定key参数转换列表,不需要额外新增列,更简洁:

result = df.groupby(df['List'].apply(tuple))['Count'].sum().reset_index()
result['List'] = result['List'].apply(list)
result = result[['Count', 'List']]

方法3:JSON序列化列表(适配复杂嵌套结构)

如果你的列表里有嵌套的复杂元素,转元组可能不好用,可以把列表序列化成JSON字符串作为分组键,兼容性更强:

import json

df['List_json'] = df['List'].apply(json.dumps)
result = df.groupby('List_json')['Count'].sum().reset_index()
result['List'] = result['List_json'].apply(json.loads)
result = result.drop('List_json', axis=1)[['Count', 'List']]

补充:为什么直接分组列表会报错?

简单来说,Pandas分组时需要把分组键存入哈希表来快速匹配分组,而列表是可变对象(你可以随时修改列表内的元素),可变对象无法被哈希,所以会抛出TypeError: unhashable type: 'list'的错误。把它转成不可变的类型(元组、字符串)就能解决这个问题啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:23:32