Pandas透视表报错TypeError: unhashable type: 'list'求助
银行流水分类透视表报错问题解决
问题原因
str.findall()返回的是列表类型,而pd.pivot_table的columns参数要求列值必须是可哈希(hashable)的类型(如字符串、数值),列表属于不可哈希类型,因此触发TypeError: unhashable type: 'list'报错。- 直接尝试将列转为字符串无效,是因为转换后会保留列表的原始格式(例如
['Transfer']),并非符合要求的分类字符串。
解决办法
方法1:取首个匹配关键词作为分类
如果每笔交易只需单一分类,提取第一个匹配到的关键词,无匹配项则设为默认分类:
import re # 预编译正则表达式提升效率 pattern = re.compile('Ref|BCA|Fund|Transfer', flags=re.IGNORECASE) # 提取首个匹配结果,无匹配则赋值'其他' dff['Category'] = dff['Description'].apply(lambda x: pattern.findall(x)[0] if pattern.findall(x) else '其他')
方法2:合并多匹配关键词为字符串
若一笔交易可能匹配多个关键词,将列表转为用分隔符连接的字符串:
# 把匹配到的关键词列表转为逗号分隔的字符串 dff['Category'] = dff['Description'].str.findall('Ref|BCA|Fund|Transfer', flags=re.IGNORECASE).str.join(', ') # 替换空值为默认分类 dff['Category'] = dff['Category'].replace('', '其他')
方法3:拆分多分类为独立行(适合多维度统计)
如果需要按每个关键词单独统计,将包含多个关键词的行拆分为多行:
# 拆分列表类型的Category列,每个关键词对应一行 dff_exploded = dff.explode('Category') # 填充空分类为默认值 dff_exploded['Category'] = dff_exploded['Category'].fillna('其他') # 重新生成透视表 pivotf = pd.pivot_table(dff_exploded, index=["Date"], columns="Category", values=['Amount'], margins=False, margins_name="Total")
效果验证
修改Category列的类型为可哈希的字符串后,再次运行透视表代码即可正常执行,生成符合预期的统计结果。
内容的提问来源于stack exchange,提问作者Tomalak2Pi
相关产品推荐
相关产品推荐

