如何在未知层级数的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
相关产品推荐
相关产品推荐

