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

