为何Pandas透视表无法运行?报错TypeError: unhashable type: 'list'
问题原因
报错TypeError: unhashable type: 'list'的核心原因是:你用str.findall()生成的Category列,每个值都是列表类型,而pandas的pivot_table要求columns参数必须是可哈希的数据类型(比如字符串、整数),列表是不可哈希的,因此无法作为分组列使用。
看你的数据,findall会返回所有匹配到的关键词组成的列表:
- 第一行描述匹配到
Transfer,Category值为['Transfer'] - 第二行描述匹配到
Ref,Category值为['Ref']
解决方法
需要把Category列的列表类型转换成字符串类型,根据你的匹配场景,有两种常用方案:
方案1:取第一个匹配的关键词(适用于多数情况)
用str.extract()代替findall(),它会直接返回第一个匹配到的字符串,避免生成列表:
import re # 替换原Category赋值代码 dff['Category'] = dff['Description'].str.extract(r'(Ref|BCA|Fund|Transfer)', flags=re.IGNORECASE)
方案2:将列表转成字符串(适用于可能匹配多个关键词的场景)
如果存在一个描述匹配多个关键词的情况,可以用分隔符把列表元素拼接成字符串:
import re # 替换原Category赋值代码 dff['Category'] = dff['Description'].str.findall('Ref|BCA|Fund|Transfer', flags=re.IGNORECASE).str.join(', ')
验证修改后的透视表代码
修改Category列后,再运行透视表代码即可正常执行:
pivotf = pd.pivot_table(dff, index=["Date"], columns="Category", values=['Amount'], margins=False, margins_name="Total")
内容的提问来源于stack exchange,提问作者Tomalak2Pi
相关产品推荐
相关产品推荐

