2017-09-24 9 views
2

die DatenrahmenPandas Datenrahmen - Spalte transponiert

gegeben
user month  valueX valueY 
-------------------------------- 
884 2013-01 1  5 
889 2013-02 0  15 
884 2013-02 7  29 
889 2013-01 9  38 

wie kann ich zu dieser bekommen:

user |2013-01-valueX |2013-02-valueX |2013-01-valueY |2013-02-valueY 
-------------------------------------------------------------------- 
884 |1    |7    |5    |19 
889 |9    |0    |38    |15 

Vielen Dank im Voraus!

Antwort

3

können Sie unstack verwenden

df1 = df.set_index(['user', 'month'])[['valueX', 'valueY']].unstack() 
df1.columns = df1.columns.swaplevel().map('-'.join) 
df1 = df1.reset_index() 

    user 2013-01-valueX 2013-02-valueX 2013-01-valueY 2013-02-valueY 
0 884  1    7    5    29 
1 889  9    0    38    15 

Edit: wie @Zero vorgeschlagen, können Sie Multi-Index-Spalten kombinieren, ohne Swaplevel() zu verwenden wie diese,

df.columns = df1.columns.map('{0[1]}-{0[0]}'.format) 
+1

'df1.columns.map (lambda x:. '{1} - {0}' Format (* x))' nicht brauchen 'swaplevel' – Zero

+0

@Zero, ja. Hinzufügen zur Antwort. Vielen Dank:) – Vaishali

2

Sie können einfach die Pivot-Funktion verwenden:

df2 = df.pivot(index='user', columns='month') 

welche Gruppen Zeilen nach ‚Benutzer‘ und Gruppen Spalten nach ‚Monat‘.

Das Ergebnis ist:

 valueX   valueY   
month 2013-01 2013-02 2013-01 2013-02 
user         
884   1  7  5  29 
889   9  0  38  15 

Hinweis: Die Spalten sind jetzt ein Multi-Level-Index, zum Beispiel ValueX für Benutzer 889 auf 2013-01 erhalten müssen Sie tun: df2.loc[889, ('valueX', '2013-01')] oder für alle Termine: df2.loc[889, ('valueX', slice(None))]

Verwandte Themen