2017-12-19 4 views
2

Ich habe diese Datenrahmen:Pandas Datenrahmen: groupby transponieren dann

df = pd.DataFrame({'1-sensor':['608', '608', '2158', '2158'], 
      '2-day':['2017-12-11', '2017-12-12', '2017-12-11', '2017-12-12'], 
      '3-voltage':[30, 31, 28, 29]}) 

df:

1-sensor  2-day 3-voltage 
0  608 2017-12-11   30 
1  608 2017-12-12   31 
2  2158 2017-12-11   28 
3  2158 2017-12-12   29 

Und ich möchte es wie folgt aussehen:

pd.DataFrame({'1-sensor':['608', '2158'], 
       '2017-12-11':[30, 28], 
       '2017-12-12':[31, 29]}) 

df:

1-sensor 2017-12-11 2017-12-12 
0  608   30   31 
1  2158   28   29 

Ich habe verschiedene Lösungen aus .groupby('sensor') und .unstack() versucht, aber nicht erfolgreich. Irgendwelche guten Vorschläge?

Danke!

+0

Bitte geben Sie die gewünschte Eingabe/Ausgabe als Code-Schnipsel, anstatt Bilder. – Nae

+0

Gibt es Aggregationen, die Sie durchführen möchten? Wenn nicht, gibt es keine Notwendigkeit für eine Gruppe. –

+1

@Nae Entschuldigung, ich habe die Bilder entfernt. – Jusstol

Antwort

1

Option 1
pivot Verwenden, wenn es keine Aggregationen sind. Dies ist tatsächlich effizienter -

df.pivot(index='1-sensor', columns='2-day', values='3-voltage') 

2-day  2017-12-11 2017-12-12 
1-sensor       
2158    28   29 
608    30   31 

Wenn es irgendwelche Aggregationen durchgeführt werden sollen, verwenden Sie pivot_table und umfassen aggfunc=....


Option 2
Eine andere Lösung mit set_index + unstack -

df.set_index(['1-sensor', '2-day']).unstack() 

      3-voltage   
2-day 2017-12-11 2017-12-12 
1-sensor      
2158    28   29 
608    30   31 

Wenn Aggregationen benötigt werden, dann groupby + unstackwird es tun. Sie waren diese schließen.

df.groupby(['1-sensor', '2-day'], sort=False).sum().unstack() 

      3-voltage   
2-day 2017-12-11 2017-12-12 
1-sensor      
608    30   31 
2158    28   29 

ersetzen sum mit dem aggfunction Sie verwenden möchten, wenn Sie ein verwenden müssen.

+1

Danke für die reichhaltige Antwort. Die erste Option funktioniert perfekt! – Jusstol

1

Sie können es auch tun, mit pd.pivot_table:

pd.pivot_table(df, index = ['1-sensor'], columns = ['2-day'], values = '3-voltage').reset_index() 
+0

Vielen Dank für Ihre Antwort, es funktioniert perfekt – Jusstol