pandas数据框在多重索引中选择列
我有一个这样的数据表(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,对于每个标签,下面有两个列,分别是 A
和 B
。
我想从这个数据表中选择出所有的 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