如何筛选MultiIndex DataFrame:排除指定层级行与列
处理MultiIndex DataFrame的行和列筛选
核心思路
通过get_level_values()分别提取索引和列指定层级的值,结合isin()和取反操作~锁定需要保留的行/列,最后用loc一次性完成筛选。
代码示例
1. 构造示例DataFrame
import pandas as pd # 创建MultiIndex索引(层级0和层级1) index = pd.MultiIndex.from_tuples( [('A', 'x'), ('B', 'y'), ('C', 'z'), ('D', 'w')], names=['level0', 'level1'] ) # 创建MultiIndex列(层级0和层级1) columns = pd.MultiIndex.from_tuples( [('col_grp1', 'a'), ('col_grp1', 'b'), ('col_grp2', 'c'), ('col_grp2', 'd')], names=['col_level0', 'col_level1'] ) # 生成示例数据 df = pd.DataFrame( [[1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16]], index=index, columns=columns )
2. 定义排除列表
# 要排除的索引第0层级值 exclude_index_level0 = ['B', 'D'] # 要排除的列第1层级值 exclude_columns_level1 = ['b', 'd']
3. 执行筛选
支持分步或一步完成:
# 方式一:分步筛选 # 先保留索引第0层级不在排除列表的行 filtered_rows = df[~df.index.get_level_values(0).isin(exclude_index_level0)] # 再保留列第1层级不在排除列表的列 filtered_df = filtered_rows.loc[:, ~filtered_rows.columns.get_level_values(1).isin(exclude_columns_level1)] # 方式二:一步到位(更简洁) filtered_df = df.loc[ ~df.index.get_level_values(0).isin(exclude_index_level0), ~df.columns.get_level_values(1).isin(exclude_columns_level1) ]
关键代码说明
df.index.get_level_values(0):提取索引第0层级的所有值~df.index.get_level_values(0).isin(exclude_index_level0):对"是否在排除列表"的结果取反,得到需要保留的行的布尔索引df.columns.get_level_values(1):提取列第1层级的所有值loc[row_condition, col_condition]:同时应用行和列的筛选规则,直接输出目标子集
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

