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']]]