2017-01-19 5 views
1

У меня есть dataframe, который выглядит следующим образом:подвыборки по столбцам мультииндексной панды DataFrame

   u1 u2 u3 u4 u5 u6 
level0 level1       
foo1 x1  0 1 0 0 0 0 
     x2  0 1 1 0 1 1 
foo2 x3  0 1 0 1 0 1 
     x4  1 0 0 0 1 1 
foo3 x5  1 0 1 0 0 0 
     x6  0 1 1 1 0 0 
foo4 x7  1 0 0 1 0 1 
     x8  0 1 1 1 0 0 

Я хочу подвыбор только те индексы, для которых u3==1. Так что, как выход, я должен получить что-то вроде:

   u1 u2 u3 u4 u5 u6 
level0 level1       
foo1 
     x2  0 1 1 0 1 1 
foo2 

foo3 x5  1 0 1 0 0 0 
     x6  0 1 1 1 0 0 
foo4 
     x8  0 1 1 1 0 0 

Я пробовал делать:

idx = pd.IndexSlice 
df.loc[idx[:,:],'u2']==1 

, который дает:

level0 level1 
foo1 x1   True 
     x2   True 
foo2 x3   True 
     x4  False 
foo3 x5  False 
     x6   True 
foo4 x7  False 
     x8   True 

, но я не знаю, как использовать этот для индексации исходного блока данных.

Любая помощь приветствуется.

ответ

1

вы можете использовать query() метод или регулярные boolean indexing:

In [11]: df.query('u2 == 1') 
Out[11]: 
       u1 u2 u3 u4 u5 u6 
level0 level1 
foo1 x1  0 1 0 0 0 0 
     x2  0 1 1 0 1 1 
foo2 x3  0 1 0 1 0 1 
foo3 x6  0 1 1 1 0 0 
foo4 x8  0 1 1 1 0 0 

In [12]: df.loc[df['u2'] == 1] 
Out[12]: 
       u1 u2 u3 u4 u5 u6 
level0 level1 
foo1 x1  0 1 0 0 0 0 
     x2  0 1 1 0 1 1 
foo2 x3  0 1 0 1 0 1 
foo3 x6  0 1 1 1 0 0 
foo4 x8  0 1 1 1 0 0 

используя .query() метод также позволяет осуществлять поиск по уровням индекса:

In [17]: df.query("level0 in ['foo2','foo3'] and u2 == 1") 
Out[17]: 
       u1 u2 u3 u4 u5 u6 
level0 level1 
foo2 x3  0 1 0 1 0 1 
foo3 x6  0 1 1 1 0 0 

UPDATE:

как я могу выбрать все u? для которых x1 == 1 и x3 == 1?

, если вы имеете в виду u1 и u3 то есть довольно много способов достижения этой цели:

In [8]: df.query("u1 == 1 and u3 == 1") 
Out[8]: 
       u1 u2 u3 u4 u5 u6 
level0 level1 
foo3 x5  1 0 1 0 0 0 

In [9]: df.loc[(df['u1'] == 1) & (df['u3'] == 1)] 
Out[9]: 
       u1 u2 u3 u4 u5 u6 
level0 level1 
foo3 x5  1 0 1 0 0 0 

In [10]: df.loc[df[['u1','u3']].eq(1).all(1)] 
Out[10]: 
       u1 u2 u3 u4 u5 u6 
level0 level1 
foo3 x5  1 0 1 0 0 0 
+0

Великий ответ! Очень ясно. Quick followup: как я могу выбрать все 'u?', Для которых 'x1 == 1' и' x3 == 1'? – reckoner

+0

Очень четкий ответ. – reckoner

Смежные вопросы