2016-02-21 14 views
5

Ho un dataframe panda come seguire ..Come calcolare la differenza tra il giorno di successive righe panda dataframe con condizioni

item_id  date 
    101  2016-01-05 
    101  2016-01-21 
    121  2016-01-08 
    121  2016-01-22 
    128  2016-01-19 
    128  2016-02-17 
    131  2016-01-11 
    131  2016-01-23 
    131  2016-01-24 
    131  2016-02-06 
    131  2016-02-07 

voglio calcolare giorni differenza tra colonna data, ma rispetto al item_id colonna. Per prima cosa voglio ordinare il dataframe con il raggruppamento delle date su item_id. Esso dovrebbe essere simile a questo

item_id  date  
    101  2016-01-05   
    101  2016-01-08   
    121  2016-01-21   
    121  2016-01-22   
    128  2016-01-17   
    128  2016-02-19 
    131  2016-01-11 
    131  2016-01-23 
    131  2016-01-24 
    131  2016-02-06 
    131  2016-02-07 

Poi voglio calcolare la differenza tra le date di nuovo raggruppamento sul item_id Così l'uscita dovrebbe essere simile seguenti

item_id  date  day_difference 
    101  2016-01-05   0 
    101  2016-01-08   3 
    121  2016-01-21   0 
    121  2016-01-22   1 
    128  2016-01-17   0 
    128  2016-02-19   2 
    131  2016-01-11   0 
    131  2016-01-23   12 
    131  2016-01-24   1 
    131  2016-02-06   13 
    131  2016-02-07   1 

Per l'ordinamento ho usato qualcosa di simile

df.groupby('item_id').apply(lambda x: new_df.sort('date'))

Ma, non ha funzionato. Sono in grado di calcolare la differenza tra le righe consecutive seguendo

(df['date'] - df['date'].shift(1))

Ma non per il raggruppamento con item_id

+1

si desidera 'df.groupby ('item_id') ['date']. diff() ' – EdChum

risposta

5

Penso che si può utilizzare:

df['date'] = df.groupby('item_id')['date'].apply(lambda x: x.sort_values()) 

df['diff'] = df.groupby('item_id')['date'].diff()/np.timedelta64(1, 'D') 
df['diff'] = df['diff'].fillna(0) 
print df 
    item_id  date diff 
0  101 2016-01-05  0 
1  101 2016-01-21 16 
2  121 2016-01-08  0 
3  121 2016-01-22 14 
4  128 2016-01-19  0 
5  128 2016-02-17 29 
6  131 2016-01-11  0 
7  131 2016-01-23 12 
8  131 2016-01-24  1 
9  131 2016-02-06 13 
10  131 2016-02-07  1 
+0

Grazie per la risposta .. :) – Neil

Problemi correlati