(KeyError):MultiIndex Slicing要求索引是完全lexsorted元组的...为什么这是由列表引起的,而不是由元组引起的?

Mar*_*ses 2 pandas

这个问题部分是为了帮助我理解lex-sorting在多索引的上下文中的含义.

假设我有一些MultiIndexed DataFrame df,对于我想要使用的索引:

a = (1, 1, 1)
Run Code Online (Sandbox Code Playgroud)

所以从我写的数据帧中提取值:

df.loc[a, df.columns[i]]
Run Code Online (Sandbox Code Playgroud)

哪个有效.但以下不是:

df.loc[list(a), df.columns[i]]
Run Code Online (Sandbox Code Playgroud)

给我错误:

*** KeyError: 'MultiIndex Slicing requires the index to be fully lexsorted tuple len (1), lexsort depth (0)'
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

另外,另一个问题是,以下性能警告意味着什么?

PerformanceWarning: indexing past lexsort depth may impact performance.
Run Code Online (Sandbox Code Playgroud)

小智 7

我将举例说明通过一个元组和列表的区别.loc,使用带有例子df

              0  1  2
first second         
bar   one     4  4  7
      two     3  4  7
foo   one     8  1  8
      two     7  5  4
Run Code Online (Sandbox Code Playgroud)

这里df.loc[('foo', 'two')]返回由此元组索引的行,即(7,5,4).该参数指定多索引的两个级别.

但这df.loc[['foo', 'two']]意味着您希望所有具有多索引顶级的行都是 'foo'或'two'.列表表示这些是您想要的选项,并且由于每个选项中只提供一个级别,因此选择基于第一个(最左侧)级别.结果:

              0  1  2
first second         
foo   one     8  1  8
      two     7  5  4
Run Code Online (Sandbox Code Playgroud)

(由于没有以'two'开头的多重指示,只有那些'foo'存在.)

在没有看到你的数据帧的情况下,我无法分辨出这种差异导致获得KeyError,但我希望现在差异很明显.