简体   繁体   English

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

[英]how to select multiple values from a single level of a dataframe multiindex

If I have the following: 如果我有以下内容:

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]

what is the easiest way to select the columns that have a second level label of "j" or "k"? 选择具有第二级标签“ 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

I can do this: 我可以做这个:

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

But that seems pretty verbose for something that feels like it should be simple. 但这对于看起来应该很简单的事情来说似乎很冗长。 Any better approaches? 有更好的方法吗?

See here for multiindex using slicers, introduced in 0.14.0 有关使用切片器的多索引的信息,请参见此处 ,于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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM