如何使用.loc筛选三级MultiIndex中的指定两层数据?
三级MultiIndex DataFrame按指定两层筛选的简洁实现
有一个带三级MultiIndex的DataFrame,需要仅根据前两层的指定组合筛选数据,目前只能通过重置索引的方式实现(如下冗余代码),想找类似df.loc[(f,slice(None))]的简洁写法:
import pandas as pd df=pd.DataFrame(index=pd.MultiIndex.from_tuples([(1,'a','x') ,(1,'a','y') ,(1,'b','z') ,(1,'b','x') ,(2,'c','y') ,(2,'c','z') ,(2,'a','x') ,(2,'a','y') ,(3,'b','z') ,(3,'b','x') ,(3,'c','y') ,(3,'c','z')]), data=[20,26,43,20,65,40,87,41,84,50,5,54]) f=[(2, 'a'), (3, 'b'), (3, 'c')] # 原冗余实现 df=df.reset_index(level=2).loc[f].reset_index().set_index(['level_0','level_1','level_2'])
简洁解法1:使用pd.IndexSlice(可读性优先)
pd.IndexSlice是Pandas专门用于多层索引筛选的工具,能直接指定前两层的筛选组合,第三层用:表示匹配所有值:
import pandas as pd idx = pd.IndexSlice filtered_df = df.loc[idx[f, :], :]
简洁解法2:直接构造筛选元组
把f中的每个前两层元组,扩展为包含slice(None)(等价于:,代表第三层所有值)的完整索引元组,再传入loc:
filter_tuples = [(*item, slice(None)) for item in f] filtered_df = df.loc[filter_tuples]
筛选结果
两种方法都能得到目标结果,无需反复重置/重建索引:
| level_0 | level_1 | level_2 | 0 |
|---|---|---|---|
| 2 | a | x | 87 |
| y | 41 | ||
| 3 | b | z | 84 |
| x | 50 | ||
| c | y | 5 | |
| z | 54 |
内容的提问来源于stack exchange,提问作者JohnnieL
相关产品推荐
相关产品推荐

