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

Mor*_*anM 4 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]
Run Code Online (Sandbox Code Playgroud)

选择具有二级标签“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
Run Code Online (Sandbox Code Playgroud)

我可以做这个:

df.loc[:, df.columns.get_level_values(1).isin(['j', 'k'])]
Run Code Online (Sandbox Code Playgroud)

但这对于感觉应该很简单的事情来说似乎相当冗长。还有更好的方法吗?

Jef*_*eff 5

请参阅此处,了解使用切片器的多索引,在 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
Run Code Online (Sandbox Code Playgroud)