如何从单个级别的数据帧多索引中选择多个值

时间:2014-08-13 16:58:19

标签: python pandas

如果我有以下内容:

df = pd.DataFrame(np.random.random((4,8)))
tupleList = zip([x for x in 'abcdefgh'], [y for y in ['iijjkkll'])
ind = pd.MultiIndex.from_tuples(tupleList)
df.columns = ind

In [71]: df
Out[71]: 
          a         b         c         d         e         f         g  \
          i         i         j         j         k         k         l   
0  0.968112  0.809183  0.144320  0.518120  0.820079  0.648237  0.971552   
1  0.959022  0.721705  0.139588  0.408940  0.230956  0.907192  0.467016   
2  0.335085  0.537437  0.725119  0.486447  0.114048  0.150150  0.894322   
3  0.051249  0.186547  0.779814  0.905914  0.024298  0.002489  0.339714   

          h  
          l  
0  0.438330  
1  0.225447  
2  0.331413  
3  0.530789  

[4 rows x 8 columns]

选择具有第二级标签“j”或“k”的列的最简单方法是什么?

          c         d         e         f
          j         j         k         k
0  0.948030  0.243993  0.627497  0.729024
1  0.087703  0.874968  0.581875  0.996466
2  0.802155  0.213450  0.375096  0.184569
3  0.164278  0.646088  0.201323  0.022498

我可以这样做:

df.loc[:, df.columns.get_level_values(1).isin(['j', 'k'])]

但对于那些感觉应该很简单的东西来说,这看起来非常冗长。有更好的方法吗?

1 个答案:

答案 0 :(得分:4)

有关使用切片机的多索引,请参阅here,在0.14.0中引入

In [36]: idx = pd.IndexSlice

In [37]: df.loc[:, idx[:, ['j', 'k']]]
Out[37]: 
          c         d         e         f
          j         j         k         k
0  0.750582  0.877763  0.262696  0.226005
1  0.025902  0.967179  0.125647  0.297304
2  0.463544  0.104973  0.154113  0.284820
3  0.631695  0.841023  0.820907  0.938378