2017-04-09 6 views
0

Pandas Datenrahmen ("df") wie folgt aussieht:Pandas: Abrufen von Werten Post-Gruppe durch Summe

    name  id   time 
1095    One  1  12:03:37.230812 
1096    Two  2  10:56:29.314745 
1097   Three  3  10:58:18.897624 
1098   Three  3  09:45:38.755116 
1099    Two  2  09:02:59.472508 
1100    One  1  12:28:38.341024 

Auf dieser, i eine Operation haben, die

df = df.groupby(by=['id'])[['time']].transform(sum).sort('time', ascending=False) 

Auf dem resultierenden ist df Ich möchte iterieren und Antwort als Name und Gesamtzeit erhalten. Wie kann ich das vom letzten df erreichen (von groupby/transform response)? So Ergebnis sollte wie folgt aussehen:

name  time 

One  24:03:37.230812 
Two  19:56:29.314745 
Three  19:58:18.897624 
+0

Zeitaddition funktioniert nicht über 'sum'. Selbst wenn Sie Zeit über Pythons "datetime" hinzufügen und wenn die Zeitaddition über 24 Stunden geht, wird sie als '00: 03: 37.230812' anstelle von' 24: 03: 37.230812' gedruckt. –

+0

Ich habe es geschafft, ein Sample abzulegen Code. Sehen Sie, wenn Sie eine Idee von ihm bekommen https://gist.github.com/ajinkyapisal/118f8541cffcc2480ffe58f9dcd156b1 –

+0

Zeit Addition funktionierte gut .. Antwort war etwas anders, es konvertiert es in Format n Tage hh: mm: ss. meine Herausforderung war, den Namen zu bekommen, da das nicht Teil der späteren Operationen war – Neo

Antwort

1

Ich glaube, Sie Spalte timeto_timedelta zuerst konvertieren müssen.

Dann groupby durch Spalte name oder id und Aggregat sum:

df.time = pd.to_timedelta(df.time) 
df = df.groupby('name', as_index=False)['time'].sum().sort_values('time', ascending=False) 
print (df) 
    name     time 
0 One 1 days 00:32:15.571836 
1 Three 0 days 20:43:57.652740 
2 Two 0 days 19:59:28.787253 

df = df.groupby('id', as_index=False)['time'].sum().sort_values('time', ascending=False) 
print (df) 
    id     time 
0 1 1 days 00:32:15.571836 
2 3 0 days 20:43:57.652740 
1 2 0 days 19:59:28.787253 

Last ist möglich convert timedeltas zu seconds von total_seconds, sind ein weiteres Gespräch here:

df.time = df.time.dt.total_seconds() 
print (df) 
    id   time 
0 1 88335.571836 
2 3 74637.652740 
1 2 71968.787253 
+0

Gruppe von "ID" ist, was ich getan habe, wie Namen für mehrere Personen gleich sein können, Herausforderung wurde den Namen endlich während der Vorbereitung der Antwort holen .. gibt es keine Möglichkeit, den Namen nach groupby ID zu lesen und zu sortieren? Eine Möglichkeit kann darin bestehen, einen Klondatenrahmen (des ursprünglichen Datenrahmens) zu erzeugen und von dort zu lesen. Jede andere effiziente Möglichkeit – Neo

+0

Ich bin mir nicht sicher, ob Sie 'df.groupby (['id', 'name'], as_index = False) verstehen '? – jezrael

Verwandte Themen