如何过滤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
相关产品推荐
相关产品推荐

