You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用.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_0level_1level_20
2ax87
y41
3bz84
x50
cy5
z54

内容的提问来源于stack exchange,提问作者JohnnieL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 02:10:33