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

如何筛选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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 21:45:33