2016-11-20 3 views
1

ich einen Datenrahmen haben wie folgt:Wie Reihen zu verschmelzen und wandeln sie in Spalten

ID START END SEQ 
1 11  12 1 
1 14  15 3 
1 13  14 2 
2 10  14 1 
3 11  15 1 
3 16  17 2 

ich es in dieser Datenrahmen zu transformieren müssen:

ID START_1 END_1 SEQ_1 START_2 END_2 SEQ_2 START_3 END_3 SEQ_3 
1 11  12  1  13  14  2  14  15  3 
2 10  14  1  NA  NA  NA NA  NA  NA 
3 11  15  1  16  17  2  NA  NA  NA 

Das Problem ist, dass die Anzahl der Zeilen mit derselben ID ist apriori unbekannt, dh die maximale Anzahl der Spalten START_X, END_X, SEQ_X sollte nicht manuell definiert werden. Gibt es einen automatisierten Weg, um diese Transformation zu tun, unter Berücksichtigung, dass die Spalten von SEQ bestellt werden sollten? Sollte ich group_by verwenden oder welche sollte der Ansatz sein?

Antwort

1

können Sie groupby mit unstack verwenden, dann sort_index und zuletzt durch list comprehensionMultiIndex von Spalten entfernen:

df['SEQ1'] = df.SEQ 
df = df.groupby(['ID','SEQ1']).mean().unstack() 
df = df.sort_index(axis=1, level=1) 
df.columns = ['_'.join((col[0], str(col[1]))) for col in df.columns] 
print (df) 
    START_1 END_1 SEQ_1 START_2 END_2 SEQ_2 START_3 END_3 SEQ_3 
ID                  
1  11.0 12.0 1.0  13.0 14.0 2.0  14.0 15.0 3.0 
2  10.0 14.0 1.0  NaN NaN NaN  NaN NaN NaN 
3  11.0 15.0 1.0  16.0 17.0 2.0  NaN NaN NaN 

Eine andere Lösung mit pivot_table, aggfunc='mean' ist standardmäßig:

df['SEQ1'] = df.SEQ 
df = df.pivot_table(index= ['ID','SEQ1']).unstack() 
df = df.sort_index(axis=1, level=1) 
df.columns = ['_'.join((col[0], str(col[1]))) for col in df.columns] 
print (df) 
    END_1 SEQ_1 START_1 END_2 SEQ_2 START_2 END_3 SEQ_3 START_3 
ID                  
1 12.0 1.0  11.0 14.0 2.0  13.0 15.0 3.0  14.0 
2 14.0 1.0  10.0 NaN NaN  NaN NaN NaN  NaN 
3 15.0 1.0  11.0 17.0 2.0  16.0 NaN NaN  NaN 
+0

Eine Frage, @jezrael . Dieser Code generiert eine zusätzliche Zeile direkt unter der Kopfzeile und fügt 'ID' in diese Zeile ein, während sich andere Kopfzeilen in der ersten Zeile befinden. Ist es möglich, es zu lösen? Eigentlich habe ich einen neuen Thread geöffnet, nur wenn du helfen willst (http://stackoverflow.com/questions/40723561/transformation-of-dataframe) – duckertito

Verwandte Themen