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

Python哈希数据时触发TypeError:unhashable type: 'numpy.ndarray'问题求助

问题:Jupyter Notebook数据处理报错TypeError: unhashable type: 'numpy.ndarray'

我来帮你分析这个问题并给出修复方案,先理清楚错误的根源,再一步步修正代码。

你的原代码

dummydata["ID_NUMBER"] = dummydata["ID_NUMBER"].to_string()
def clean_dummydata(dummydata,cols):
    for col_name in cols:
        keys = {cats: i for i,cats in str(hash(dummydata[col_name].unique()))}
        dummydata[col_name] = dummydata[col_name].apply(lambda x: keys[x])
    return dummydata
cols = ['ID_NUMBER']
dummydata = clean_dummydata(dummydata,cols)
dummydata.to_csv('anon_dummydata.csv')

报错信息

TypeError Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_3140/2100616149.py in 
      7 
      8 cols = ['ID_NUMBER']
----> 9 dummydata = clean_dummydata(dummydata,cols)
     10 dummydata.to_csv('anon_dummydata.csv')

~\AppData\Local\Temp/ipykernel_3140/2100616149.py in clean_dummydata(dummydata, cols)
      2 def clean_dummydata(dummydata,cols):
      3     for col_name in cols:
----> 4         keys = {cats: i for i,cats in str(hash(dummydata[col_name].unique()))}
      5         dummydata[col_name] = dummydata[col_name].apply(lambda x: keys[x])
      6     return dummydata

TypeError: unhashable type: 'numpy.ndarray'

错误原因拆解

  1. 第一处逻辑错误:dummydata["ID_NUMBER"].to_string()会把整个Series转换成一个单一的长字符串,而不是把每个元素转为字符串类型,这会导致后续处理完全偏离你的预期。
  2. 核心报错原因:dummydata[col_name].unique()返回的是numpy数组,而hash()函数无法处理数组类型(数组是可变对象,不可哈希),这直接触发了TypeError。另外,就算能hash,把hash结果转成字符串后遍历的是每个字符,这也不是你想要的「给每个唯一ID映射一个数字」的匿名化逻辑。

修复后的完整代码

# 正确将每个ID元素转为字符串类型
dummydata["ID_NUMBER"] = dummydata["ID_NUMBER"].astype(str)

def clean_dummydata(dummydata, cols):
    for col_name in cols:
        # 获取该列的所有唯一值,转为列表
        unique_vals = dummydata[col_name].unique().tolist()
        # 创建唯一值到数字的映射字典(从0开始编号)
        keys = {val: idx for idx, val in enumerate(unique_vals)}
        # 用map替代apply,效率更高
        dummydata[col_name] = dummydata[col_name].map(keys)
    return dummydata

cols = ['ID_NUMBER']
dummydata = clean_dummydata(dummydata, cols)
dummydata.to_csv('anon_dummydata.csv')

关键改进说明

  • 用astype(str)替代to_string(),确保每一个ID元素都被转为字符串类型,而不是整个列变成一个大字符串。
  • 直接基于列的唯一值生成映射字典,用enumerate()自动分配数字索引,这才是实现ID匿名化(标签编码)的正确逻辑。
  • 用map()替代apply(),对于Series的元素映射操作,map()的执行效率比apply()更高,尤其处理大数据量时差异明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 11:04:09