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

Pandas如何按一二级列索引筛选多级列索引DataFrame

Pandas两级列索引DataFrame筛选方案

测试数据构造

先复现你给出的示例DataFrame,方便验证结果:

import pandas as pd

# 构建两级列索引
columns = pd.MultiIndex.from_arrays(
    [['A', 'A', 'B', 'B'], ['one', 'two', 'three', 'four']]
)
# 生成示例数据
df = pd.DataFrame(
    [
        [0.895717, -1.206412, 1.431256, -1.170299],
        [0.410835, 0.132003, -0.076467, 1.130127],
        [-1.413681, 1.024180, 0.875906, 0.974466]
    ],
    index=pd.Index(['A', 'B', 'C'], name='ID'),
    columns=columns
)

需求1:按一级列索引筛选该层级下所有二级列

如果不需要保留一级列层级,直接传入一级索引名即可,注意字符串类型的索引名需要加引号:

# 直接筛选,结果仅保留二级列索引
res1 = df['A']

如果需要和你给出的示例一样,保留原有的两级列结构,使用loc做列切片即可:

# 保留两级列结构的筛选结果
res1 = df.loc[:, ['A']]

返回结果和预期完全一致:

A          
           one       two
ID                      
A     0.895717 -1.206412
B     0.410835  0.132003
C    -1.413681  1.024180

需求2:跨一级索引,匹配不同一级索引下的指定二级列

Pandas原生没有df[A[two],B[three,four]]这种语法,最直接的实现方式是传入由(一级索引名, 二级索引名)格式元组组成的列表,Pandas会自动匹配对应多级列:

# 选取A下的two列、B下的three和four列
res2 = df[
    [
        ('A', 'two'),
        ('B', 'three'),
        ('B', 'four')
    ]
]

返回结果和预期完全一致:

A         B          
           two     three      four
ID                                
A    -1.206412  1.431256 -1.170299
B     0.132003 -0.076467  1.130127
C     1.024180  0.875906  0.974466

如果需要高频做这类筛选,可以写一个简单的辅助函数,实现接近你预期的传参风格:

def select_multi_cols(df, *col_rules):
    """
    多级列筛选辅助函数
    col_rules格式:(一级索引名, 二级索引名/二级索引名列表)
    """
    selected_cols = []
    for level1, level2 in col_rules:
        if isinstance(level2, list):
            selected_cols.extend([(level1, l2) for l2 in level2])
        else:
            selected_cols.append((level1, level2))
    return df[selected_cols]

# 调用示例
res2 = select_multi_cols(df, ('A', 'two'), ('B', ['three', 'four']))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 10:09:17