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

如何在未知层级数的Pandas多级列索引DataFrame中选取最内层列?

解决多级列索引DataFrame中选取最内层指定列的问题

不管列索引的上层层级数量是多少,我们可以通过以下两种简洁方法,精准选取最内层指定名称的列,同时完整保留所有上层索引信息:

方法1:布尔索引直接筛选(推荐)

利用MultiIndex的get_level_values(-1)直接定位最内层列名,生成布尔掩码后筛选列,逻辑简单且高效:

import pandas as pd

def select_inner_column(df, target_name):
    # 生成最内层列名等于目标值的布尔掩码
    inner_col_mask = df.columns.get_level_values(-1) == target_name
    # 返回筛选后的DataFrame,自动保留所有上层索引
    return df.loc[:, inner_col_mask]

方法2:动态生成IndexSlice切片

如果习惯使用pd.IndexSlice,可以根据列索引的层级数动态生成切片前缀,适配任意层级数量:

def select_inner_column_with_slice(df, target_name):
    # 根据层级数生成对应数量的':'前缀
    slice_prefix = tuple([':'] * (df.columns.nlevels - 1))
    # 组合包含目标列名的完整切片
    target_slice = pd.IndexSlice[slice_prefix + ([target_name],)]
    return df.loc[:, target_slice]

示例验证

两级列索引场景

创建测试数据:

two_level_cols = pd.MultiIndex.from_tuples([
    ('foo', 'ham'), ('foo', 'spam'),
    ('bar', 'ham'), ('bar', 'spam'),
    ('baz', 'ham'), ('baz', 'spam')
])
df_two = pd.DataFrame([[1,2,2,3,4,42]], columns=two_level_cols)

调用函数后输出:

foo bar baz
    spam spam spam
0     2   3   42

三级列索引场景

创建测试数据:

three_level_cols = pd.MultiIndex.from_tuples([
    ('foo', 'one', 'ham'), ('foo', 'one', 'spam'),
    ('bar', 'two', 'ham'), ('bar', 'two', 'spam'),
    ('baz', 'three', 'ham'), ('baz', 'three', 'spam')
])
df_three = pd.DataFrame([[1,2,2,3,4,42]], columns=three_level_cols)

调用函数后输出:

foo      bar      baz
    one      two      three
    spam spam spam spam spam spam
0     2   3   42

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 14:08:20