2016-07-11 13 views
4

Ich habe einen Datenrahmen:Stapel alle Ebene eines Multiindex

index = pd.MultiIndex.from_product([['a', 'b'], ['A', 'B'], ['One', 'Two']]) 
df = pd.DataFrame(np.arange(16).reshape(2, 8), columns=index) 
df 

enter image description here

Wie stapeln wir alle Ebene der MultiIndex, ohne zu wissen, wie viele Ebene Spalten.

erwarte ich, dass die Ergebnisse wie folgt aussehen:

0 a A One  0 
     Two  1 
     B One  2 
     Two  3 
    b A One  4 
     Two  5 
     B One  6 
     Two  7 
1 a A One  8 
     Two  9 
     B One 10 
     Two 11 
    b A One 12 
     Two 13 
     B One 14 
     Two 15 
dtype: int64 

Antwort

4

Sie erste len Ebenen finden, bekommen range und übergeben es an stack:

print (df.columns.nlevels) 
3 

print (list(range(df.columns.nlevels))) 
[0, 1, 2] 

print (df.stack(list(range(df.columns.nlevels)))) 
0 a A One  0 
     Two  1 
     B One  2 
     Two  3 
    b A One  4 
     Two  5 
     B One  6 
     Two  7 
1 a A One  8 
     Two  9 
     B One 10 
     Two 11 
    b A One 12 
     Two 13 
     B One 14 
     Two 15 
dtype: int32 
+0

Ich habe eine if/else auf ' isinstance (df.columns, pd.MultiIndex) '. Ich wusste nichts über nlevels. – piRSquared

+0

Wird 'df.stack (range (df.columns.nlevels))' in Python 3 fehlschlagen? Beachten Sie, dass ich den Aufruf von 'list' entfernt habe. – piRSquared

+1

Ja, es gibt den Fehler 'KeyError: 'Level range (0, 3) not found'' zurück – jezrael

Verwandte Themen