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

