pandas数据框在多重索引中选择列

125 投票
3 回答
209612 浏览
提问于 2025-04-18 16:26

我有一个这样的数据表(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)列。

3 个回答

40

编辑* 现在最好的方法是使用 indexSlice 来进行多重索引选择

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

方法一:

df.xs('A', level='Col', axis=1)

想了解更多,可以参考这个链接:http://pandas.pydata.org/pandas-docs/stable/advanced.html#cross-section

方法二:

df.loc[:, (slice(None), 'A')]

注意:这个方法需要标签是排好序的。想了解更多,可以参考这个链接:http://pandas.pydata.org/pandas-docs/stable/advanced.html#the-need-for-sortedness-with-multiindex

151

有一个叫做 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

撰写回答