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

如何过滤Pandas多列索引DataFrame并保留所有列层级名称

Pandas多级列索引筛选后保留全部层级名称的方法

当使用Pandas处理带多级列索引的DataFrame时,按["A", "X"]这类条件筛选后,默认结果会自动丢弃前面的列层级名称,只保留最后一层。以下是具体场景与解决方法:

场景复现

首先创建带多级列索引的示例DataFrame:

import pandas as pd

# 创建带多级列索引的示例DataFrame
df = pd.DataFrame(
    [[1, 2, 3, 4], [5, 6, 7, 8]],
    columns=[["A", "A", "A", "B"], ["X", "X", "Y", "X"], [10, 20, 30, 40]],
    index=["row1", "row2"],
)
df.columns = df.columns.set_names(["level_1", "level_2", "level_3"])

print(df)

输出结果:

level_1  A        B
level_2  X     Y  X
level_3 10 20 30 40
row1     1  2  3  4
row2     5  6  7  8

执行默认筛选代码时,仅保留最后一层级:

print(df.loc[:, pd.IndexSlice["A", "X"]])

输出:

level_3  10  20
row1      1   2
row2      5   6

我们需要的是保留所有列层级名称的结果:

level_1  A   
level_2  X   
level_3 10 20
row1     1  2
row2     5  6

解决方法

方法1:使用xs方法并设置drop_level=False

xs是Pandas专为多级索引设计的筛选工具,通过drop_level=False参数可强制保留所有列层级:

result = df.xs(("A", "X"), level=["level_1", "level_2"], axis=1, drop_level=False)
print(result)

输出符合预期的层级保留结果。

方法2:使用loc配合完整索引切片

在loc中明确指定所有层级的切片规则,避免自动降维:

result = df.loc[:, ("A", "X", slice(None))]
print(result)

其中slice(None)表示匹配当前层级的所有元素,同样能保留全部列层级。


单列筛选兼容

如果筛选后结果为单列,上述方法依然有效,不会丢失层级信息。例如筛选["A", "X", 10]:

result_single = df.xs(("A", "X", 10), level=["level_1", "level_2", "level_3"], axis=1, drop_level=False)
print(result_single)

输出:

level_1  A
level_2  X
level_3 10
row1     1
row2     5

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 05:07:25