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'
错误原因拆解
- 第一处逻辑错误:
dummydata["ID_NUMBER"].to_string()会把整个Series转换成一个单一的长字符串,而不是把每个元素转为字符串类型,这会导致后续处理完全偏离你的预期。 - 核心报错原因:
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
相关产品推荐
相关产品推荐

