基于列值Pandas对group执行操作

时间:2017-09-19 06:23:55

标签: python pandas

我有一个分组的pandas数据帧

x   y   id  date        qty
6   3   932 2017-05-14  212  
6   3   932 2017-05-15  212  
6   3   932 2017-05-18  212  
6   3   933 2016-10-03  518  
6   3   933 2016-10-09  16  
6   3   933 2016-10-15  28  

我想知道如何获取特定ID的每个订单之间的天数。第一个日期应该是第0天,连续列值是第一个订单之后的天数。像这样的东西

x   y  id  date  qty
6   3  932  0   212  
6   3  932  1   212  
6   3  932  3   212  
6   3  933  0   518  
6   3  933  6   16  
6   3  933  6   28  

2 个答案:

答案 0 :(得分:3)

diff()date群组中使用id,然后使用访问者获取dt.days天,使用NaN填充0

In [772]: df.groupby('id')['date'].diff().dt.days.fillna(0)
Out[772]:
0    0.0
1    1.0
2    3.0
3    0.0
4    6.0
5    6.0
Name: date, dtype: float64

In [773]: df['date'] = df.groupby('id')['date'].diff().dt.days.fillna(0)

In [774]: df
Out[774]:
   x  y   id  date  qty
0  6  3  932   0.0  212
1  6  3  932   1.0  212
2  6  3  932   3.0  212
3  6  3  933   0.0  518
4  6  3  933   6.0   16
5  6  3  933   6.0   28

详细

原始df

In [776]: df
Out[776]:
   x  y   id        date  qty
0  6  3  932  2017-05-14  212
1  6  3  932  2017-05-15  212
2  6  3  932  2017-05-18  212
3  6  3  933  2016-10-03  518
4  6  3  933  2016-10-09   16
5  6  3  933  2016-10-15   28

In [778]: df.dtypes
Out[778]:
x                int64
y                int64
id               int64
date    datetime64[ns]
qty              int64
dtype: object

答案 1 :(得分:3)

您可id NaT获取groupby,使用diff重新print (df) x y id date qty 0 6 3 932 2017-05-14 212 1 6 3 932 2017-05-15 212 2 6 3 932 2017-05-18 212 3 6 3 933 2016-10-03 518 4 6 3 933 2016-10-09 16 5 6 3 933 2016-10-15 28 #if necessary convert to datetime df['date'] = pd.to_datetime(df['date']) df['date'] = df.groupby(['id'])['date'].diff().fillna(0).dt.days print (df) x y id date qty 0 6 3 932 0 212 1 6 3 932 1 212 2 6 3 932 3 212 3 6 3 933 0 518 4 6 3 933 6 16 5 6 3 933 6 28 ,最后获得fillna

float

由于功能的排序,days非常相似,只输出int而非-Wall