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

处理格式不良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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 21:52:21