Python 为什么熊猫'loc'会抛出带有列名的'KeyError'?

Python 为什么熊猫'loc'会抛出带有列名的'KeyError'?,python,pandas,Python,Pandas,我有一个数据帧,它被赋予了这个初始构造: df_data = pd.DataFrame(columns=['name','date','c1','c2']).set_index(['name','date']) 然后我有代码从数据库填充这个框架。我可以打印部分或全部帧,并得到合理的结果。比如: print df_data.c1.head(3) name date Joe 2019-01-01 234324 2019-01-02 4565 2019-01-03 573 N

我有一个数据帧,它被赋予了这个初始构造:

df_data = pd.DataFrame(columns=['name','date','c1','c2']).set_index(['name','date'])
然后我有代码从数据库填充这个框架。我可以打印部分或全部帧,并得到合理的结果。比如:

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
print df_data.loc['Joe', 'c1']

date
2019-01-01 234324
2019-01-02 4565
2019-01-03 573
Name: c1, type: object
从数据库中填充后,我进行了各种分析计算,尝试使用
loc
访问数据,例如,
df_data.loc['Joe','c1']
我希望从中得到一个结果,其中包含索引的日期和列
c1
的值,其中“name”多索引的一部分已被选定为“Joe”。比如:

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
print df_data.loc['Joe', 'c1']

date
2019-01-01 234324
2019-01-02 4565
2019-01-03 573
Name: c1, type: object
我已经运行了三次,用不同的日期范围填充框架。三项工作中的两项工作如预期和上文所述。在第三个例子中,对于
df_data.loc['Joe',c1']
,我得到了
KeyError:('Joe',c1')
,但是,即使在这个“坏”的例子中,对于
df_data.loc['Joe'].c1,我也得到了一个非常好的结果,我认为在这种情况下应该给出相同的答案。我还可以打印整个帧
df_数据
,得到一个完全合理的结果。我将这里的
KeyError
解释为熊猫认为
c1
应该在索引中,而不是给出列名

我无法在一个单独的例子中重现这一点,因为出于我无法理解的原因,结果似乎取决于帧中的数据,而不是帧的结构。(三种情况中的两种情况下,相同的结构“有效”)因此,具体问题:

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

好问题。我没有答案,但我认为如果你检查三个场景的
df_data.index
的内容,可能会给出一些有用的见解。实际帧相当大,因此会输出大量数据。在结构上并没有什么不同,但我稍后将再次详细介绍。