2016-02-21 10 views
5

Mam dataframe pandy jak po ..Jak obliczyć dzień na różnicę między kolejnymi rzędami pandy dataframe warunku

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 

Chcę obliczyć różnicę dni pomiędzy datą kolumnie, lecz w odniesieniu do item_id kolumnie. Najpierw chcę posortować ramkę danych z grupowaniem dat na item_id. Powinien on wyglądać następująco

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 

Następnie chcę obliczyć różnicę między datami znowu grupujące na item_id Więc wyjście powinno wyglądać po

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 

do sortowania Kiedyś coś jak ten

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

Ale to się nie udało. Jestem w stanie obliczyć różnicę między kolejnymi rzędami wykonując

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

ale nie do grupowania z item_id

+1

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

Odpowiedz

5

myślę, że można użyć:

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

Dzięki za odpowiedź .. :) – Neil

Powiązane problemy