索引Pandas数据帧时的KeyError

Sim*_*mbi 26 python pandas

我试图将csv文件中的数据读入pandas数据帧,并访问第一列'Date'

import pandas as pd
df_ticks=pd.read_csv('values.csv', delimiter=',')
print(df_ticks.columns)
df_ticks['Date']
Run Code Online (Sandbox Code Playgroud)

产生以下结果

Index([u'Date', u'Open', u'High', u'Low', u'Close', u'Volume'], dtype='object')
KeyError: u'no item named Date'
Run Code Online (Sandbox Code Playgroud)

如果我尝试访问任何其他列,如"打开"或"音量",它按预期工作

Gui*_*not 32

正如alko所提到的,它可能是文件开头的额外字符.使用时read_csv,可以指定encoding处理编码和标题字符,称为BOM(字节顺序标记)

df = pd.read_csv('values.csv', delimiter=',', encoding="utf-8-sig")
Run Code Online (Sandbox Code Playgroud)

这个问题在Stackoverflow上找到了一些回声: Pandas在读取制表符分隔的数据时似乎忽略了第一列名称,给出了KeyError

  • 是否有类似的东西,read_excel改变所有unicode列名称和剥离随机空格?像这样简单:str(col).strip()引发错误 (4认同)
  • 我很惊讶 df.columns 没有显示这个额外的字符! (3认同)

alk*_*lko 23

您最有可能在文件的开头添加一个额外的字符,该字符将添加到您的第一个列名称之前'Date'.只需将输出复制/粘贴到非unicode控制台即可生成.

Index([u'?Date', u'Open', u'High', u'Low', u'Close', u'Volume'], dtype='object')
Run Code Online (Sandbox Code Playgroud)


cs9*_*s95 5

这几乎总是这些原因之一

  1. 您将列名称拼写错误
  2. 有前导/尾随空格
    • 在这种情况下,请使用df.columns = df.columns.str.strip()来删除它们,或者重新访问您的pd.read_csv(或其他 IO 函数)调用以查看是否可以在解析输入时删除它们
  3. 你的列实际上不是一个列,而是一个索引级别
    • 您可以使用检查索引级别名称df.index.names来查看它是否存在。.reset_index()在选择列之前调用应该可以修复它。
  4. 您的 DataFrame 根本没有该列
    • 这一切都只是你的想象而已。请关闭您的系统并小睡一会儿。

无论原因是什么,第一步都是停止正在做的事情,运行print(df.columns.tolist())并观察结果,看看可能是这 4 个可能原因中的哪一个。