2016-08-06 38 views
2

Ich arbeite an einem Datenrahmen in Pandas mit vier Spalten user_id, time_stamp1, time_stamp2 und interval. Time_stamp1 und time_stamp2 haben den Typ datetime64 [ns] und interval den Typ timedelta64 [ns].add timedelta Daten innerhalb einer Gruppe in Pandas Datenrahmen

Ich möchte in dem Datenrahmen für jeden User_id Intervallwert summieren und ich versuchte es in vielerlei Hinsicht wie zu berechnen:

1)df["duration"]= df.groupby('user_id')['interval'].apply (lambda x: x.sum()) 

2)df ["duration"]= df.groupby('user_id').aggregate (np.sum) 

3)df ["duration"]= df.groupby('user_id').agg (np.sum) 

aber keiner von ihnen arbeiten und der Wert der duration wird NaT sein nach die Codes laufen lassen.

+0

was über 'df.groupby ('us er_id ') [' interval ']. sum() 'oder' df.groupby (' user_id ') [' interval ']. agg (' sum ') '? – MaxU

+0

Ich überprüfte auch diese beiden, aber das Ergebnis in der "duration" Spalte ist '' Nat'' – user3854325

+0

können Sie einige Beispieldatensatz? – MaxU

Antwort

0

UPDATE: können Sie transform() Methode verwenden:

In [291]: df['duration'] = df.groupby('user_id')['interval'].transform('sum') 

In [292]: df 
Out[292]: 
        a user_id     b   interval   duration 
0 2016-01-01 00:00:00  0.01 2015-11-11 00:00:00 51 days 00:00:00 838 days 08:00:00 
1 2016-03-10 10:39:00  0.01 2015-12-08 18:39:00    NaT 838 days 08:00:00 
2 2016-05-18 21:18:00  0.01 2016-01-05 13:18:00 134 days 08:00:00 838 days 08:00:00 
3 2016-07-27 07:57:00  0.01 2016-02-02 07:57:00 176 days 00:00:00 838 days 08:00:00 
4 2016-10-04 18:36:00  0.01 2016-03-01 02:36:00 217 days 16:00:00 838 days 08:00:00 
5 2016-12-13 05:15:00  0.01 2016-03-28 21:15:00 259 days 08:00:00 838 days 08:00:00 
6 2017-02-20 15:54:00  0.02 2016-04-25 15:54:00 301 days 00:00:00 1454 days 00:00:00 
7 2017-05-01 02:33:00  0.02 2016-05-23 10:33:00 342 days 16:00:00 1454 days 00:00:00 
8 2017-07-09 13:12:00  0.02 2016-06-20 05:12:00 384 days 08:00:00 1454 days 00:00:00 
9 2017-09-16 23:51:00  0.02 2016-07-17 23:51:00 426 days 00:00:00 1454 days 00:00:00 

ALTE Antwort:

Demo:

In [260]: df 
Out[260]: 
        a     b   interval user_id 
0 2016-01-01 00:00:00 2015-11-11 00:00:00 51 days 00:00:00  1 
1 2016-03-10 10:39:00 2015-12-08 18:39:00    NaT  1 
2 2016-05-18 21:18:00 2016-01-05 13:18:00 134 days 08:00:00  1 
3 2016-07-27 07:57:00 2016-02-02 07:57:00 176 days 00:00:00  1 
4 2016-10-04 18:36:00 2016-03-01 02:36:00 217 days 16:00:00  1 
5 2016-12-13 05:15:00 2016-03-28 21:15:00 259 days 08:00:00  1 
6 2017-02-20 15:54:00 2016-04-25 15:54:00 301 days 00:00:00  2 
7 2017-05-01 02:33:00 2016-05-23 10:33:00 342 days 16:00:00  2 
8 2017-07-09 13:12:00 2016-06-20 05:12:00 384 days 08:00:00  2 
9 2017-09-16 23:51:00 2016-07-17 23:51:00 426 days 00:00:00  2 

In [261]: df.dtypes 
Out[261]: 
a   datetime64[ns] 
b   datetime64[ns] 
interval timedelta64[ns] 
user_id    int64 
dtype: object 

In [262]: df.groupby('user_id')['interval'].sum() 
Out[262]: 
user_id 
1 838 days 08:00:00 
2 1454 days 00:00:00 
Name: interval, dtype: timedelta64[ns] 

In [263]: df.groupby('user_id')['interval'].apply(lambda x: x.sum()) 
Out[263]: 
user_id 
1 838 days 08:00:00 
2 1454 days 00:00:00 
Name: interval, dtype: timedelta64[ns] 

In [264]: df.groupby('user_id').agg(np.sum) 
Out[264]: 
        interval 
user_id 
1  838 days 08:00:00 
2  1454 days 00:00:00 

So Ihre Daten überprüfen ...

+0

Ich habe gefunden, was das Problem ist. Ihr Code funktioniert auch für mich, wenn ich die Summe aus dem Datenrahmen sehen möchte. Ich meine, wenn ich das Ergebnis als neue Spalte sehen will, funktioniert es nicht. Wenn Sie diesen Code ausführen, wird es nicht funktionieren: df ['duration] = df.groupby (' user_id ') [' interval ']. sum() – user3854325

+0

@ user3854325, bitte überprüfen Sie UPDATE in meiner Antwort – MaxU

+0

Vielen Dank. Für mich geht das. – user3854325