【问题标题】:Pandas KeyError: value not in indexPandas KeyError:值不在索引中
【发布时间】:2016-11-22 14:35:00
【问题描述】:

我有以下代码,

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 太陌生了,不知道如何修复它。

【问题讨论】:

  • 仅仅是p = p.astype(int)不够吗?很难说你为什么要这样索引列,这两个列表看起来相同,从你的输入数据来看,你看起来不像是排除列。
  • 即使您对所查看的列进行子集化(即排除['5Thu' '7Sat']),您仍然会遇到将np.nan 转换为int 的错误。您可以使用不同的填充值(对于缺少的条目)来解决这个问题。
  • 最终我需要索引中的所有工作日(例如,'5Thu' '7Sat'),因为接下来我将绘制它们。所以我正在寻找在不影响平均值的情况下将它们全部添加的方法。

标签: python pandas indexing dataframe


【解决方案1】:

使用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)

【讨论】:

    【解决方案2】:

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

    [['Gender']]
    

    如果您可以轻松访问 csv,则可以使用 excel 公式 trim() 剪切单元格的任何空格。

    或像这样删除它

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

    【讨论】:

    • 恐怕我的情况完全不同:“它一直在工作,直到 csv 文件没有足够的覆盖率”,即使症状是相同。不过感谢您的意见。
    • 你已经报道了一个非常不明显的案例,非常感谢
    • 这应该被标记为正确答案 - 因为这是一个通用答案
    【解决方案3】:

    我有同样的问题。

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

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

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

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

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

    之后:

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

    这样,问题就消失了。

    【讨论】:

      【解决方案4】:

      请尝试这样做来清理和格式化您的列名:

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

      【讨论】:

        猜你喜欢
        • 2018-04-30
        • 1970-01-01
        • 2017-03-02
        • 1970-01-01
        • 2015-07-27
        • 2018-05-16
        • 2020-02-03
        • 2021-10-29
        • 2020-09-25
        相关资源
        最近更新 更多