Pandas KeyError:值不在索引中

问题描述 投票:0回答:5

我有以下代码,

df = pd.read_csv(CsvFileName)

p = df.pivot_table(index=['Hour'], columns='DOW', values='Changes', aggfunc=np.mean).round(0)
p.fillna(0, inplace=True)

p[["1Sun", "2Mon", "3Tue", "4Wed", "5Thu", "6Fri", "7Sat"]] = p[["1Sun", "2Mon", "3Tue", "4Wed", "5Thu", "6Fri", "7Sat"]].astype(int)

它一直在工作,直到 csv 文件没有足够的覆盖范围(所有工作日)。例如,对于以下 .csv 文件,

DOW,Hour,Changes
4Wed,01,237
3Tue,07,2533
1Sun,01,240
3Tue,12,4407
1Sun,09,2204
1Sun,01,240
1Sun,01,241
1Sun,01,241
3Tue,11,662
4Wed,01,4
2Mon,18,4737
1Sun,15,240
2Mon,02,4
6Fri,01,1
1Sun,01,240
2Mon,19,2300
2Mon,19,2532

我会收到以下错误:

KeyError: "['5Thu' '7Sat'] not in index"

它似乎有一个非常简单的修复,但我对 Python 太陌生,不知道如何修复它。

python pandas indexing dataframe
5个回答
50
投票

使用

reindex
获取您需要的所有列。它将保留已经存在的内容并放入空列中。

p = p.reindex(columns=['1Sun', '2Mon', '3Tue', '4Wed', '5Thu', '6Fri', '7Sat'])

因此,您的整个代码示例应如下所示:

df = pd.read_csv(CsvFileName)

p = df.pivot_table(index=['Hour'], columns='DOW', values='Changes', aggfunc=np.mean).round(0)
p.fillna(0, inplace=True)

columns = ["1Sun", "2Mon", "3Tue", "4Wed", "5Thu", "6Fri", "7Sat"]
p = p.reindex(columns=columns)
p[columns] = p[columns].astype(int)

32
投票

我有一个非常相似的问题。我遇到了同样的错误,因为 csv 标题中包含空格。我的 csv 包含标题“性别”,我将其列为:

[['Gender']]

如果您可以轻松访问 csv,您可以使用 Excel 公式

trim()
剪切单元格的任何空格。

或者像这样删除它

df.columns = df.columns.to_series().apply(lambda x: x.strip())


5
投票

请尝试此方法来清理并格式化您的列名称:

df.columns = (df.columns.str.strip().str.upper()
              .str.replace(' ', '_')
              .str.replace('(', '')
              .str.replace(')', ''))

0
投票

我也有同样的问题。

在第一次开发期间,我使用了一个 .csv 文件(逗号作为分隔符),在保存之前我对其进行了一些修改。 保存后逗号变成了分号。

在 Windows 上,它取决于“区域和语言选项”自定义屏幕,您可以在其中找到列表分隔符。这是 Windows 应用程序期望作为 CSV 分隔符的字符。

在从全新文件进行测试时,我遇到了这个问题。

我删除了 read_csv 方法中的“sep”参数 之前:

df1 = pd.read_csv('myfile.csv', sep=',');

之后:

df1 = pd.read_csv('myfile.csv');

这样,问题就消失了。


0
投票

有一列不匹配的训练表。

当我们尝试添加列时,它会显示。 -> 6178 raise KeyError(f"{not_found} 不在索引中")

KeyError:“['垃圾']不在索引中”

您已添加列 bd_test['垃圾']=np.nan

© www.soinside.com 2019 - 2024. All rights reserved.