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

如何删除MultiIndex表头中符合[A-Z]\d+模式的指定列?

移除MultiIndex表头中符合[A-Z]\d+模式的内层列

问题场景

你有一个带双层MultiIndex列的DataFrame,需要移除内层索引符合[A-Z]\d+(单个大写字母+数字)格式的列,尝试通过stack+filter+unstack的方式处理,但得到了空DataFrame,需要修复正则表达式并得到正确结果。

错误原因分析

你原来的正则表达式r'[^[A-Z]\d]'存在两个核心问题:

  1. 语法逻辑错误:[^...]是字符集取反,只会匹配单个不属于[A-Z]或数字的字符,无法实现“匹配整个字符串不满足[A-Z]\d+格式”的需求。
  2. 筛选逻辑颠倒:该正则会过滤掉所有包含大写字母或数字的列名,导致最终没有列被保留,返回空DataFrame。

解决方案

方法一:直接筛选MultiIndex列(推荐,高效)

不需要重塑数据,直接针对内层列索引做精准筛选:

import pandas as pd

# 构造原DataFrame
section_1 = pd.MultiIndex.from_product([['SECTION 1'], ['CED', 'D', 'C1']])
section_2 = pd.MultiIndex.from_product([['SECTION 2'], ['BCD', 'FGH', 'CE', 'L1', 'L2']])
section_3 = pd.MultiIndex.from_product([['SECTION 3'], ['A6', 'AB', 'KLMN', 'A5']])
columns = section_1.append(section_2).append(section_3)
df = pd.DataFrame([[None]*len(columns)], columns=columns)

# 筛选内层索引不匹配^[A-Z]\d+$的列
mask = ~df.columns.get_level_values(1).str.match(r'^[A-Z]\d+$')
wanted = df.loc[:, mask]
print(wanted)

输出:

SECTION 1          SECTION 2               SECTION 3                  
        CED     D          BCD   FGH    CE          AB  KLMN
0      None  None         None  None  None        None  None

解释:

  • df.columns.get_level_values(1)获取内层列索引;
  • str.match(r'^[A-Z]\d+$')检查内层索引是否完全匹配“单个大写字母+一个或多个数字”的格式;
  • ~取反得到需要保留的列的掩码,最后用loc筛选列。

方法二:修复你的stack/unstack思路

通过负向前瞻正则排除符合模式的列名,还原你的处理逻辑:

wanted = df.stack(0, dropna=False).filter(regex=r'^(?!([A-Z]\d+)$).*$').unstack()
print(wanted)

解释:

  • stack(0)将外层列(SECTION 1/2/3)转成行索引的一部分,此时列变为内层索引(CED、D等);
  • 正则r'^(?!([A-Z]\d+)$).*$'使用负向前瞻,表示“整个字符串不是完全由单个大写字母+数字组成”,从而筛选出需要保留的列;
  • unstack()将行索引还原为外层列,恢复原MultiIndex结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 07:50:03