无法访问具有级别名称的 MultiIndex DataFrame

Posted

技术标签:

【中文标题】无法访问具有级别名称的 MultiIndex DataFrame【英文标题】:Can't access a MultiIndex DataFrame with level names 【发布时间】:2018-11-04 04:24:23 【问题描述】:

我第一次尝试使用 MultiIndexing,但我不明白为什么我不能直接使用助记符名称索引 DataFrame,而不是像使用单级索引时那样通过 .loc 方法正如它在文档和我在网上遇到的几个示例中显示的那样。

以下是一些简化的代码和两种方法的输出:

import numpy as np
import pandas as pd
ext = ['ms0', 'ms1', 'ms2']
node = ['supply', 'vdd', 'id0']
index = pd.MultiIndex.from_product([ext, node],names=('extension', 'nodes'))
df = pd.DataFrame(np.random.randn(9, 1), index=index)
df

                           0
extension   nodes   
      ms0  supply   2.730935
              vdd  -1.771695
              id0   1.644740
      ms1  supply   1.086473
              vdd   0.234862
              id0   0.910154
      ms2  supply  -0.274787
              vdd   0.450530
              id0   0.197895

以下作品:

df.loc['ms0']

                    0
     nodes  
    supply   2.730935
       vdd  -1.771695
       id0   1.644740

但这不是:

df['ms0']

...
D:\Apps\Anaconda3\lib\site-packages\pandas\core\indexes\base.py in 
get_loc(self, key, method, tolerance)
   2525                 return self._engine.get_loc(key)
   2526             except KeyError:
-> 2527                 return 
self._engine.get_loc(self._maybe_cast_indexer(key))
   2528 
   2529         indexer = self.get_indexer([key], method=method, 
tolerance=tolerance)

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

KeyError: 'ms0'

MultiIndexing 的文档显示了这个例子:

In [25]: df['bar']
Out[25]: 
second       one       two
A       0.895717  0.805244
B       0.410835  0.813850
C      -1.413681  1.607920

那么为什么在这种情况下它不起作用呢?

【问题讨论】:

'bar' 在该示例中是数据框的一列。 df['ms0'] 语法正在查找列。 loc 格式正在查找索引和可选的列:df.loc['ms0']df.loc['ms0',0] 相同。 要按级别访问,您可以使用 xs 语法,例如:df.xs('ms0',level=0)df.xs('supply',level=1) 【参考方案1】:

使用 df['ms0'] 将选择 'ms0' 列,该列不在显示的 DataFrame 中。另一方面,df.loc['ms0'] 将选择索引为'ms0'的行,这是有效的。

https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html

【讨论】:

以上是关于无法访问具有级别名称的 MultiIndex DataFrame的主要内容,如果未能解决你的问题,请参考以下文章

从具有多个切片的 pandas MultiIndex 中检索列 [重复]

将级别附加到 pandas MultiIndex

不同长度的pandas groupby元组-ValueError:在通过级别中找不到值:MultiIndex

Pandas Dataframe Multiindex 按级别和列值排序

从具有包含 NaN 的 MultiIndex 索引的数据帧中获取值

将多个键上的 pandas 数据帧映射为列或 multiIndex