如何基于二级索引列表筛选Pandas三级MultiIndex数据?
问题场景
给定如下Pandas代码:
import pandas as pd import numpy as np np.random.seed(0) idx = pd.MultiIndex.from_product([[1,2,3], ['a', 'b', 'c'], [6, 7]]) df = pd.DataFrame(np.random.randn(18), index=idx) selection = [(1, 'a'), (2, 'b')]
需要筛选出索引前缀匹配selection中任意元素的行,目标索引为:
(1, 'a', 6), (1, 'a', 7), (2, 'b', 6), (2, 'b', 7)
更简洁的Pandas风格实现
推荐两种更贴合Pandas向量化操作习惯的写法:
方法一:get_level_values + isin组合
df.loc[df.index.get_level_values([0, 1]).isin(selection)]
方法二:Pandas 1.5.0+ 专属简化写法
如果你的Pandas版本不低于1.5.0,可直接在isin中指定匹配的索引层级,代码更直观:
df.loc[df.index.isin(selection, level=[0, 1])]
优势说明
- 原方法的列表推导式属于逐元素遍历的循环操作,数据量较大时,效率远低于Pandas的向量化API
- 上述两种写法均采用Pandas内置的向量化操作,代码更简洁易读,完全贴合Pandas的惯用风格
内容的提问来源于stack exchange,提问作者Chachni
相关产品推荐
相关产品推荐

