Python 按指定级别的多个值对多索引数据帧进行切片

Python 按指定级别的多个值对多索引数据帧进行切片,python,pandas,dataframe,multi-index,Python,Pandas,Dataframe,Multi Index,我想从第二级通过多个值对多索引进行切片。例如,在以下数据帧中: val1 val2 ind1 ind2 ind3 1 6 s1 10 8 2 7 s1 20 6 3 8 s2 30 4 4 9 s2 50 2 5 10 s3 60 0 我只希望对ind3==s1或ind3==s3的行进行切片

我想从第二级通过多个值对多索引进行切片。例如,在以下数据帧中:

                val1  val2
ind1 ind2 ind3            
1    6    s1      10     8
2    7    s1      20     6
3    8    s2      30     4
4    9    s2      50     2
5    10   s3      60     0
我只希望对
ind3==s1
ind3==s3
的行进行切片:

           val1  val2
ind1 ind2            
1    6       10     8
2    7       20     6
5    10      60     0
最好的假设选项是将多个参数传递给,因为可以显式地声明所需的
级别

很明显,我可以看到所有被单值数据帧分割的数据帧:

In[2]: pd.concat([df.xs('s1',level=2), df.xs('s3',level=2)])
Out[2]:
           val1  val2
ind1 ind2            
1    6       10     8
2    7       20     6
5    10      60     0
但是(a)当使用2个以上的值时,它很乏味,可读性也不好,(b)对于大型数据帧,它相当重(或者至少比多值切片选项重,如果存在的话)

以下是构建示例数据帧的代码:

                val1  val2
ind1 ind2 ind3            
1    6    s1      10     8
2    7    s1      20     6
3    8    s2      30     4
4    9    s2      50     2
5    10   s3      60     0

与数据帧中的大多数选择一样,您可以使用掩码或索引器(
loc

要获取掩码,您可以在多索引上使用
get_level_值
(),后跟
isin
()

要使用
loc

df.loc[(slice(None), slice(None), ['s1', 's3']), :].reset_index(level=2, drop=True)
两种输出

           val1  val2
ind1 ind2            
1    6       10     8
2    7       20     6
5    10      60     0

注:
loc
方式也可以写成Alberto Garcia Raboso的回答。许多人更喜欢这种语法,因为它与
索引的
loc
语法更为一致。中讨论了这两种语法样式。

您可以使用
索引:

idx = pd.IndexSlice
result = df.loc[idx[:, :, ['s1', 's3']], idx[:]]
result.index = result.index.droplevel('ind3')
print(result)
输出:

val1 val2
ind1 ind2
1    6       10     8
2    7       20     6
5    10      60     0
上面的第二行也可以写成

result = df.loc(axis=0)[idx[:, :, ['s1', 's3']]]

indexlice
-不错@感谢您的回复!第二个答案是第一个,所以我同意了,但你的答案也行。这应该是选择的答案。美丽的!谢谢你的回复!注意,我正在寻找一个结果w.o.“ind3”。
result = df.loc(axis=0)[idx[:, :, ['s1', 's3']]]