假设我有一个看起来像这样的数据框:
pd.DataFrame({'category': [1,1,1,2,2,2,3,3,3,4],
'date_start': ['2018-04-09','2018-05-03', '2018-06-22', '2018-09-21', '2018-12-01', '2018-12-24', '2018-02-24', '2018-03-31','2018-08-01', '2018-01-29'],
'order_start': [1,2,3,1,2,3,1,2,3,1]})
Out[67]:
category date_start order_start
0 1 2018-04-09 1
1 1 2018-05-03 2
2 1 2018-06-22 3
3 2 2018-09-21 1
4 2 2018-12-01 2
5 2 2018-12-24 3
6 3 2018-02-24 1
7 3 2018-03-31 2
8 3 2018-08-01 3
9 4 2018-01-29 1
如您所见,order_start取决于类别和date_start。这只是按类别开始的顺序。
创建包含与上次开始的天数差异的新列的最简单/最有效的方法是什么?我想要看起来像这样的东西:
pd.DataFrame({'category': [1,1,1,2,2,2,3,3,3,4],
'date_start': ['2018-04-09','2018-05-03', '2018-06-22', '2018-09-21', '2018-12-01', '2018-12-24', '2018-02-24', '2018-03-31','2018-08-01', '2018-01-29'],
'order_visit': [1,2,3,1,2,3,1,2,3,1],
'diff_with_last_start': [0, 30, 24, 0, 23, 56, 0, 43, 54, 0]})
Out[68]:
category date_start order_start diff_with_previous_start
0 1 2018-04-09 1 0
1 1 2018-05-03 2 25
2 1 2018-06-22 3 49
3 2 2018-09-21 1 0
4 2 2018-12-01 2 70
5 2 2018-12-24 3 56
6 3 2018-02-24 1 0
7 3 2018-03-31 2 43
8 3 2018-08-01 3 54
9 4 2018-01-29 1 0
注意1:每个类别的第一个开始的差异始终为0。
注意2:在我的示例中,我没有计算确切的天差
答案 0 :(得分:2)
使用groupby
和diff
:
pd.to_datetime(df['date_start']).groupby(df['category']).diff().dt.days
# or, if `date_start` is already datetime,
df.groupby('category')['date_start'].diff().dt.days
0 NaN
1 24.0
2 50.0
3 NaN
4 71.0
5 23.0
6 NaN
7 35.0
8 123.0
9 NaN
Name: date_start, dtype: float64
df['diff_with_previous_start'] = (
pd.to_datetime(df['date_start'])
.groupby(df['category'])
.diff()
.dt.days
.fillna(0, downcast='infer')
)
df
category date_start order_start diff_with_previous_start
0 1 2018-04-09 1 0
1 1 2018-05-03 2 24
2 1 2018-06-22 3 50
3 2 2018-09-21 1 0
4 2 2018-12-01 2 71
5 2 2018-12-24 3 23
6 3 2018-02-24 1 0
7 3 2018-03-31 2 35
8 3 2018-08-01 3 123
9 4 2018-01-29 1 0