2017-10-24 3 views
2

einen multIndex Datenrahmen Gegeben:Filtering Zeilen von einem bestimmten Indexebene in einem Multiindex Datenrahmen

mux = pd.MultiIndex.from_arrays([ 
    list('aaaabbbbbccdddddd'), 
    list('tuvwlmnopxyfghijk') 
], names=['one', 'two']) 

df = pd.DataFrame({'col': np.arange(len(mux))}, mux) 

df 

     col 
one two  
a t  0 
    u  1 
    v  2 
    w  3 
b l  4 
    m  5 
    n  6 
    o  7 
    p  8 
c x  9 
    y  10 
d f  11 
    g  12 
    h  13 
    i  14 
    j  15 
    k  16 

Ist es möglich, Reihen zu halten, um entsprechend bis zu dem i-ten Wert der 0-ten Ebene des Datenrahmen?

Für i = 2, meine erwartete Ausgabe ist:

  col 
one two  
a t  0 
    u  1 
    v  2 
    w  3 
b l  4 
    m  5 
    n  6 
    o  7 
    p  8 

Beachten Sie, dass nur Zeilen a und b im Zusammenhang gehalten werden, alles andere fallen gelassen wird. Ich hoffe, dass das Problem klar ist, aber wenn es nicht so ist, bitte fragen Sie nach Erklärungen.

Ich habe versucht:

idx = pd.IndexSlice 
df.iloc[(idx[:2], slice(None))] 

Aber das gibt mir nur die ersten beiden Zeilen in der gesamten df, nicht alle Reihen der ersten beiden Werte in der 0-ten Ebene.

+0

Funktioniert 'df.loc [df.index.levels [0] [: 2] .values]' für Sie? Mir ist klar, dass es nicht sehr direkt ist, aber zumindest bekommt, was du brauchst? – johnchase

+0

@johnchase Yup, es funktioniert für dieses Beispiel (zögern Sie nicht, eine Antwort zu schreiben). Ich habe gehofft, dass es eine Lösung gibt, die auf jedes Level übersetzt werden kann. Ich weiß, das funktioniert nicht für die 1. Ebene (nur die 0.). –

Antwort

1

Ein Weg, um dies zu realisieren ist den Indexwert für die 0-te Ebene zurückzukehren und dann Index in den ursprünglichen Datenrahmen mit denen:

df.loc[df.index.levels[0][:2].values] 

     col 
one two  
a t  0 
    u  1 
    v  2 
    w  3 
b l  4 
    m  5 
    n  6 
    o  7 
    p  8 

Wie dies in den Kommentaren erwähnten funktioniert nur bei der 0-ten Stufe und nicht die erste. Es könnte eine verallgemeinerbare Lösung geben, die mit anderen Ebenen zusammenarbeitet.

+0

Ich habe diese Frage gestellt, um eine Antwort nur für die 0. Ebene zu bekommen, also gibt mir deine Antwort, was ich für jetzt brauche. Vielen Dank! –

+0

An dieser Stelle scheint es nicht völlig unvernünftig zu sein, die Frage nach Lösungen auf allen Ebenen zu modifizieren, aber ich bin froh, dass es trotzdem nützlich war! – johnchase

Verwandte Themen