为什么 pandas `loc` 会抛出带有列名的 `KeyError` ?

Bri*_*ick 9 python pandas

我有一个数据框,给出了这个初始构造:

df_data = pd.DataFrame(columns=['name','date','c1','c2']).set_index(['name','date'])
Run Code Online (Sandbox Code Playgroud)

然后我有代码从数据库填充这个框架。我可以打印部分或全部框架并获得合理的结果。就像是:

print df_data.c1.head(3)

name date
Joe  2019-01-01 234324
     2019-01-02 4565
     2019-01-03 573
Name: c1, dtype: object
Run Code Online (Sandbox Code Playgroud)

从数据库填充后,我进行了各种分析计算,尝试使用locas 访问数据,例如,df_data.loc['Joe', 'c1'] 我希望从中获得结果,其中包含索引的日期和列的值c1,其中“名称”部分多重索引的已被选择为“Joe”。就像是:

print df_data.loc['Joe', 'c1']

date
2019-01-01 234324
2019-01-02 4565
2019-01-03 573
Name: c1, type: object
Run Code Online (Sandbox Code Playgroud)

我已经运行了三次,用不同的日期范围填充框架。三者中的两个按预期工作并如上所述。在第三个中,我得到KeyError: ('Joe', 'c1')df_data.loc['Joe', 'c1'],但是,即使在这种“损坏”的情况下,我也得到了一个非常好的结果df_data.loc['Joe'].c1,我认为在这种情况下应该给出相同的答案。我还可以打印整个框架df_data并获得完美合理的结果。我将KeyError这里解释为 Pandas 认为c1应该在索引中而不是给出列名。

我无法在独立的示例中重现这一点,因为由于我无法理解的原因,结果似乎取决于框架中的数据而不是框架的结构。(相同的结构“适用于”三种情况中的两种。)那么具体的问题:

  • 为什么或在什么情况下该语法会loc['Joe', 'c1']导致c1被视为键的一部分而不是列名?(无论我可能有什么其他错误,我不知道这里的第二个参数应该在任何记录的情况下解释为键的一部分,例如我没有类似的东西loc[('Joe','c1')]。)
  • 是否存在已知或记录的情况,其中框架中的数据的某些内容可能会导致数据访问调用的解释方式发生这种变化?

Mos*_*ner 1

使用元组表示法:df_data.loc[('Joe', 'c1')]. 请参阅: https: //pandas.pydata.org/docs/user_guide/advanced.html#advanced-indexing-with-hierarchical-index