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

如何获取Pandas多级列索引DataFrame中某一级的全部列与另一级的指定列?

解决Pandas多级列索引混合选择层级与单列的问题

嗨,这个需求我太熟悉了!直接用df.loc[:, ["bar", ("baz", "two")]]确实行不通,因为Pandas没办法自动识别你是要选整个层级还是单个元组列。不过我们有几种简单的方法来实现你要的效果:

方法1:使用pd.IndexSlice(最推荐的多级索引工具)

IndexSlice是Pandas专门用来处理多级索引的利器,能帮你灵活组合不同层级的选择:

import numpy as np
import pandas as pd
np.random.seed(123)
iterables = [["bar", "baz", "foo", "qux"], ["one", "two"]]
idx = pd.MultiIndex.from_product(iterables, names=["first", "second"])
df = pd.DataFrame(np.random.randn(4, 8), columns=idx)

# 初始化IndexSlice
idx_slice = pd.IndexSlice

# 组合选择:bar层级的所有列 + baz层级下的two列
selected = df.loc[:, idx_slice["bar", :].append(idx_slice["baz", "two"])]
print(selected)

这段代码里,idx_slice["bar", :]会选中"first"层级为"bar"的所有列,idx_slice["baz", "two"]精准选中指定的单列,用append把两者组合起来就能得到你要的结果。

方法2:分别获取列再合并

如果你觉得IndexSlice有点绕,也可以分步获取需要的列再合并:

# 获取bar层级的全部列(返回的是MultiIndex类型的列索引)
bar_columns = df.loc[:, "bar"].columns
# 手动指定需要的baz_two列
baz_two_column = [("baz", "two")]

# 合并列并筛选
selected = df[bar_columns.union(baz_two_column)]

或者更直白的方式:

# 把bar的所有列转成列表,加上指定的单列
selected_cols = list(df.loc[:, "bar"].columns) + [("baz", "two")]
selected = df[selected_cols]

方法3:用布尔掩码筛选列

我们还可以通过列的层级值生成布尔掩码,来筛选符合条件的列:

# 生成掩码:first层级是bar,或者(first是baz且second是two)
mask = (df.columns.get_level_values("first") == "bar") | \
       ((df.columns.get_level_values("first") == "baz") & 
        (df.columns.get_level_values("second") == "two"))

# 用掩码筛选列
selected = df.loc[:, mask]

为什么原写法不行?

你之前尝试的df.loc[:, ["bar", ("baz", "two")]]失效的原因是:Pandas的多级列索引中,每一列的名称是元组(比如("bar", "one")),而你传入的"bar"是单个字符串,Pandas找不到名称为"bar"的列,自然无法匹配。必须明确告诉Pandas你要针对层级进行选择,而不是单个列名。

运行上面任意一种方法,都能得到你想要的结果:

first  bar       baz
second one       two       two
0     -1.085631  0.997345 -1.506295
1      1.265936 -0.866740 -0.094709
2      2.205930  2.186786  0.386186
3     -1.253881 -0.637752 -1.428681

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 21:12:43