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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 10:40:47