Pandas 多索引:高级索引-如何选择数据帧的不同部分?

Pandas 多索引:高级索引-如何选择数据帧的不同部分?,pandas,indexing,multi-index,Pandas,Indexing,Multi Index,我的矩阵是df2。现在我想选择“foo”、“one”和“two”的所有行,但只选择多索引“bar”的“one”行。这似乎很容易,但我已经尝试了很多事情都没有成功 arrays = [np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux']), np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'])] df2 = pd.Dat

我的矩阵是df2。现在我想选择“foo”、“one”和“two”的所有行,但只选择多索引“bar”的“one”行。这似乎很容易,但我已经尝试了很多事情都没有成功

arrays = [np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux']),
          np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'])]

df2 = pd.DataFrame(np.random.randn(8, 4), index=arrays)
,生成一个类似的矩阵,但包含我不想要的“baz”行

df2.loc['bar':('foo','one')]
,也类似,但第二行的“foo”,“two”我不想要

df2.loc['bar':('foo','one')]

如果有人能提供帮助并提供一些处理多索引的技巧,那就太好了

在单行中,IMO最简单的方法是使用查询构建表达式,如下所述:


否则,使用更常规的方法,您可以考虑

df.query("ilevel_0 == 'foo' or (ilevel_0 == 'bar' and ilevel_1 == 'one')") 

                0         1         2         3
bar one  0.249768  0.619312  1.851270 -0.593451
foo one  0.770139 -2.205407  0.359475 -0.754134
    two -1.109005 -0.802934  0.874133  0.135057
其中包括两部分:

pd.concat([df.loc[['foo']], df.loc[[('bar', 'one')]]]) 

                0         1         2         3
foo one  0.770139 -2.205407  0.359475 -0.754134
    two -1.109005 -0.802934  0.874133  0.135057
bar one  0.249768  0.619312  1.851270 -0.593451
以及


每个索引周围的大括号用于防止级别在切片操作过程中下降。

我很有信心这会有所帮助。谢谢您的回复!这将是解决问题的最快方法:<代码> Pd。CONAT([DF.LOC[[ Fo''] ],DF.LOC[[(Bar),'One ] ] ] ] @ @ EZRabLeMeNDEAL,请考虑投票并标记接受的答案(点击左边的灰色检查,将其切换为绿色)。这表明你觉得这个答案很有帮助。非常感谢。
df.loc[['foo']]

                0         1         2         3
foo one  0.770139 -2.205407  0.359475 -0.754134
    two -1.109005 -0.802934  0.874133  0.135057
df.loc[[('bar', 'one')]]

                0         1        2         3
bar one  0.249768  0.619312  1.85127 -0.593451