我有一个分组的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
答案 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
。