MultiIndex列选择:如何组合不同Sample的指定T值列筛选
多索引列DataFrame的多条件列筛选
问题描述
给定一个列是多层索引(MultiIndex)的DataFrame,构造代码如下:
import pandas as pd import numpy as np arrays = [['A','A','B','B','C','C'],[1,1,3,3,5,5],[2,2,4,4,6,6],[0.1,0.2,0.3,0.4,0.5,0.6]] index = pd.MultiIndex.from_arrays(arrays, names=('Sample','P1','P2','T')) data = np.random.rand(10,6) df = pd.DataFrame(columns=index, data=data)
需要筛选出Sample为A且T=0.2的列,以及Sample为C且T=0.5的列。单独筛选单个条件的列可以通过slice(None)实现,但直接用元组列表组合筛选会报错。要求不使用pd.concat完成筛选。
可行方案
方案1:布尔掩码筛选
通过提取列索引的层级值生成布尔条件,再组合筛选:
# 生成两个条件的布尔掩码 cond_a = (df.columns.get_level_values('Sample') == 'A') & (df.columns.get_level_values('T') == 0.2) cond_c = (df.columns.get_level_values('Sample') == 'C') & (df.columns.get_level_values('T') == 0.5) # 合并条件并筛选列 filtered_df = df.loc[:, cond_a | cond_c]
方案2:使用pd.IndexSlice组合切片
利用pd.IndexSlice(可简写为idx)包装每个筛选规则,再传入列表作为列参数:
idx = pd.IndexSlice # 直接传入多组切片规则 filtered_df = df.loc[:, [idx['A', :, :, 0.2], idx['C', :, :, 0.5]]]
IndexSlice会自动解析每个切片对应的多索引层级,避免直接使用元组列表导致的索引匹配错误。
内容的提问来源于stack exchange,提问作者germ
相关产品推荐
相关产品推荐

