无法访问具有级别名称的 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 groupby元组-ValueError:在通过级别中找不到值:MultiIndex
Pandas Dataframe Multiindex 按级别和列值排序