2017-09-16 5 views
0

Dies ist ähnlich zu dem Problem, das ich fragte here. Ich habe jedoch herausgefunden, dass die Daten, die ich arbeite, nicht immer konsistent sind. Denn Beispiel sagen:Split Spalten in MultiIndex mit fehlenden Spalten in Pandas

import pandas as pd 

df = pd.DataFrame(pd.DataFrame([[1,2,3,4],[5,6,7,8],[9,10,11,12]],columns=["X_a","Y_c","X_b","Y_a"])) 

    X_a Y_c X_b Y_a 
0 1 2 3 4 
1 5 6 7 8 
2 9 10 11 12 

Jetzt können Sie sehen, dass X nicht c Spalte und Y nicht über entsprechende b Spalte hat entspricht. Nun, wenn ich die Multi-Level-Index erstellen möchten, möchte ich die Datenrahmen wie folgt aussehen:

 X    Y 
    a b c a b c 
0 1 3 -1 4 -1 2 
1 5 7 -1 8 -1 6 
2 9 11 -1 12 -1 10 

So wie Sie sehen können, habe ich die Spaltung so wollen, dass alle oberen Ebene Spalten sollte die die gleichen unteren Spalten. Da der Datensatz positiv ist, denke ich darüber nach, die fehlenden Spalten mit -1 zu füllen, obwohl ich dazu offen bin. Das nächste, was ich zu meinem Problem gefunden habe, war this answer. Allerdings kann ich es nicht schaffen, irgendwie mit MultiLevel Index wie in meiner vorherigen Frage zu arbeiten. Jede Hilfe wird geschätzt.

Antwort

2

Erstellen Sie eine MultiIndex und setzen Sie df.columns.

idx = df.columns.str.split('_', expand=True) 
idx 
MultiIndex(levels=[['X', 'Y'], ['a', 'b', 'c']], 
      labels=[[0, 1, 0, 1], [0, 2, 1, 0]]) 

df.columns = idx 

Jetzt, mit den bestehenden MultiIndex, einen neuen Index erstellen, und dass das Original reindex verwenden.

idx = pd.MultiIndex.from_product([idx.levels[0], idx.levels[1]]) 
idx 
MultiIndex(levels=[['X', 'Y'], ['a', 'b', 'c']], 
     labels=[[0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2]]) 

df.reindex(columns=idx, fill_value=-1) 
    X   Y  
    a b c a b c 
0 1 3 -1 4 -1 2 
1 5 7 -1 8 -1 6 
2 9 11 -1 12 -1 10 
Verwandte Themen