Python 使用多索引获取具有标签值的所有行

Python 使用多索引获取具有标签值的所有行,python,pandas,multi-index,Python,Pandas,Multi Index,假设您有一个带有多索引的熊猫数据帧。您希望获取具有特定值的标签的所有行。你是怎么做到的 我的第一个想法是一个布尔掩码 df[df.index.labels==1].head() 但这是行不通的 谢谢 您需要指定使用的索引。在我的示例中,我使用了第二个索引(我的数据帧是s,因为在熊猫的多索引页面中是这样的): 如果键入以下内容,您实际上可以看到索引是如何构造的: s.index 由此产生的结构是: MultiIndex(levels=[['bar', 'baz', 'foo', 'qux'],

假设您有一个带有多索引的熊猫数据帧。您希望获取具有特定值的标签的所有行。你是怎么做到的

我的第一个想法是一个布尔掩码

df[df.index.labels==1].head()

但这是行不通的


谢谢

您需要指定使用的索引。在我的示例中,我使用了第二个索引(我的数据帧是s,因为在熊猫的多索引页面中是这样的):

如果键入以下内容,您实际上可以看到索引是如何构造的:

s.index
由此产生的结构是:

MultiIndex(levels=[['bar', 'baz', 'foo', 'qux'], [1, 2]],
       labels=[[0, 0, 1, 1, 2, 2, 3, 3], [0, 1, 0, 1, 0, 1, 0, 1]],
       names=['first', 'second'])
下面我有完整的代码:

>>> import pandas as pd
>>> import numpy as np
>>> arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
...           [1, 2, 1, 2, 1, 2, 1, 2]]
... 
>>> tuples = list(zip(*arrays))
>>> index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
>>> s = pd.Series(np.random.randn(8), index=index)
>>> s[s.index.labels[1]==1]
first  second
bar    2        -0.304029
baz    2        -1.216370
foo    2         1.401905
qux    2        -0.411468
dtype: float64
我将使用:

然后,您可以取等级A等于1的:

In [13]: df.xs(key=1, level="A")
Out[13]:
   C
B
2  3
使用
drop\u level=False
进行筛选(不删除A索引):

替代解决方案:

In [62]: df = pd.DataFrame({'idx1': ['A','B','C'], 'idx2':[1,2,3], 'val': [30,10,20]}).set_index(['idx1','idx2'])

In [63]: df
Out[63]:
           val
idx1 idx2
A    1      30
B    2      10
C    3      20

In [64]: df[df.index.get_level_values('idx2') == 2]
Out[64]:
           val
idx1 idx2
B    2      10

In [65]: df[df.index.get_level_values(1) == 2]
Out[65]:
           val
idx1 idx2
B    2      10

您可以将索引转换回列,然后进行筛选。它当然只适用于一个索引。它应该与多索引一起工作,但我不确定。显示您使用的数据帧。为什么要进行向下投票?是否有明确的文件记录?不清楚吗?这样做没有帮助吗?很明显,我不是那个投票反对的人,我也不知道是谁投了反对票。但我可以说,我已经多次看到这个问题,并得到了多次回答。尝试可能有人认为你在这项研究上投入的精力不够。如果你将鼠标悬停在“向下投票”按钮上,它会显示“这个问题没有显示任何研究成果”。希望这能有所帮助。您没有一个示例数据框架可供使用。
In [13]: df.xs(key=1, level="A")
Out[13]:
   C
B
2  3
In [14]: df.xs(key=1, level="A", drop_level=False)
Out[14]:
     C
A B
1 2  3
In [62]: df = pd.DataFrame({'idx1': ['A','B','C'], 'idx2':[1,2,3], 'val': [30,10,20]}).set_index(['idx1','idx2'])

In [63]: df
Out[63]:
           val
idx1 idx2
A    1      30
B    2      10
C    3      20

In [64]: df[df.index.get_level_values('idx2') == 2]
Out[64]:
           val
idx1 idx2
B    2      10

In [65]: df[df.index.get_level_values(1) == 2]
Out[65]:
           val
idx1 idx2
B    2      10