这是一个获得这个片段的方法:
df.sort_index(inplace=True)
idx = pd.IndexSlice
df.loc[idx[:, ('foo','bar'), 'can'], :]
生产
hi
a b c
1 bar can 3
foo can 1
2 bar can 7
foo can 5
3 bar can 11
foo can 9
请注意,您可能需要对MultiIndex进行排序,然后才能进行分割.那么大熊猫很好,可以警告你是否需要这样做:
KeyError: 'MultiIndex Slicing requires the index to be fully lexsorted tuple len (3), lexsort depth (1)'
您可以阅读更多关于如何在docs中使用切片机
如果由于某种原因使用切片器不是一个选项,这里是使用.isin()方法获取相同切片的一种方法:
df[df.index.get_level_values('b').isin(ix_use.get_level_values(0)) & df.index.get_level_values('c').isin(ix_use.get_level_values(1))]
这显然不是那么简洁.
更新:
由于您在此更新的条件是一种方式:
cond1 = (df.index.get_level_values('b').isin(['foo'])) & (df.index.get_level_values('c').isin(['can']))
cond2 = (df.index.get_level_values('b').isin(['bar'])) & (df.index.get_level_values('c').isin(['baz']))
df[cond1 | cond2]
生产:
hi
a b c
1 foo can 1
bar baz 2
2 foo can 5
bar baz 6
3 foo can 9
bar baz 10