Pandas DataFrame 多重索引下的列选择

123

我有以下的 pd.DataFrame:

Name    0                       1                      ...
Col     A           B           A            B         ...
0       0.409511    -0.537108   -0.355529    0.212134  ...
1       -0.332276   -1.087013    0.083684    0.529002  ...
2       1.138159    -0.327212    0.570834    2.337718  ...

它具有具有多个索引列,names=['Name', 'Col']并且具有分层级别。标签Name从0到n,对于每个标签都有两个AB列。

我想要子选择此数据框中的所有A(或B)列。


1
这是在0.14.0中引入的:http://pandas.pydata.org/pandas-docs/stable/indexing.html#multiindexing-using-slicers,“df.loc [:,(slice(None),'A')]” - Jeff
3个回答

150

有一个get_level_values方法,您可以与布尔索引一起使用,以获得预期的结果。

In [13]:

df = pd.DataFrame(np.random.random((4,4)))
df.columns = pd.MultiIndex.from_product([[1,2],['A','B']])
print df
          1                   2          
          A         B         A         B
0  0.543980  0.628078  0.756941  0.698824
1  0.633005  0.089604  0.198510  0.783556
2  0.662391  0.541182  0.544060  0.059381
3  0.841242  0.634603  0.815334  0.848120
In [14]:

print df.iloc[:, df.columns.get_level_values(1)=='A']
          1         2
          A         A
0  0.543980  0.756941
1  0.633005  0.198510
2  0.662391  0.544060
3  0.841242  0.815334

7
请注意,使用列名引用索引级别,df.columns.get_level_values("Col"),在Pandas 1.1.5中似乎也能起作用。 - user21952-is-a-great-name

64

9
可以使用 .xs() 方法来处理多列数据吗?比如说,处理列 A 和列 B 的数据? - darXider
17
这些解决方案似乎都过于复杂了,应该有一种更直观的方法来完成这个任务。 - Soren
注意:不能使用 xs 设置值。必须使用切片来设置值。 - IanS
1
根据文档字符串,df.xs(('A', 'B'), ...)应该可以工作。 - user21952-is-a-great-name

40

编辑* 目前最好的方法是使用indexSlice进行多索引选择

idx = pd.IndexSlice
A = df.loc[:,idx[:,'A']]
B = df.loc[:,idx[:,'B']]

非常优雅的方法,谢谢你! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接