处理格式不良CSV生成DataFrame时遇TypeError问题求助
解决DataFrame列调用报错
TypeError: unhashable type: 'numpy.ndarray' 问题场景
我处理一份格式混乱的CSV做数据分析,导入后的DataFrame结构有问题,于是按以下步骤处理:
- 生成小时级datetime序列,替换原有的日期和小时列
- 删除冗余行、列,重新设置列名
- 将字符串格式的数值转成浮点型,创建新DataFrame
df_2 - 把datetime列设为索引,计算流量总和与差值
但操作完成后,调用df_2['DK2_NP']或者df_2.head()都会抛出错误:TypeError: unhashable type: 'numpy.ndarray',只能用iloc来调用列。
错误原因
这个报错的核心是**df_2的列名不是可哈希的字符串/整数类型,而是numpy数组对象**。通常是在重设列名的环节出了问题:比如直接把numpy数组赋值给了df_2.columns,或者从原DataFrame提取列名时没转换成普通列表。numpy数组本身是不可哈希的类型,而DataFrame要求列名必须是可哈希的,所以用字符串索引就会报错。
解决步骤
1. 确认列名类型
先运行以下代码查看当前列名的类型:
print(type(df_2.columns)) print(df_2.columns)
如果输出显示列名是numpy.ndarray,就需要转换成普通列表。
2. 修复列名类型
直接把列名转成列表即可:
df_2.columns = df_2.columns.tolist()
或者手动指定列名列表(替换成你的实际列名):
df_2.columns = ['datetime', 'DK2_NP', '列名3', '列名4']
3. 排查列名设置环节
回顾处理流程中设置列名的代码,比如如果是从原DataFrame的某一行提取列名,要确保转成列表:
# 错误写法:直接赋值numpy数组 df_2.columns = df.iloc[0].values # 正确写法:转成列表 df_2.columns = df.iloc[0].values.tolist()
4. 重建DataFrame时指定列名
如果是通过pd.DataFrame()创建df_2,直接在创建时指定columns参数为字符串列表:
df_2 = pd.DataFrame( data=你的处理后数据, columns=['datetime', 'DK2_NP', '其他列名'] )
验证修复
完成上述操作后,再调用df_2['DK2_NP']或者df_2.head(),应该就能正常运行了。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

