2017-01-19 11 views
1

Ich habe einen Datenrahmen, der wie folgt aussieht:Subselect von Spalten in Multiindex Pandas 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 

Ich mag für die u3==1 nur die Indizes Unterauswahl. So, wie Ausgang, sollte ich so etwas bekommen:

   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 

ich versucht habe zu tun:

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

die gibt:

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

aber ich weiß nicht, wie diese zu verwenden, um den ursprünglichen Datenrahmen zu indizieren.

Jede Hilfe wird geschätzt.

Antwort

1

können Sie query() Methode oder regelmäßige boolean indexing verwenden:

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 

mit .query() Methode ermöglicht es Ihnen auch von Indexebenen suchen:

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:

wie Kann ich alle auswählen? für welche x1 == 1 und x3 == 1?

wenn Sie meinen u1 und u3 dann gibt es durchaus ein paar Möglichkeiten, dies zu erreichen:

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

Große Antwort! Sehr deutlich. Quick followup: Wie kann ich alle 'u?' Für die 'x1 == 1' und' x3 == 1' auswählen? – reckoner

+0

Sehr klare Antwort. – reckoner

Verwandte Themen