我有一个日期框架“ df”,用于存储用户的订单:
user_id order_date
0 a 2018-01-17
1 a 2018-04-29
2 a 2018-05-19
3 a 2018-05-21
4 a 2018-06-15
5 b 2018-09-18
6 b 2019-01-30
7 b 2019-02-01
8 b 2019-07-03
9 c 2019-07-31
10 c 2019-12-10
11 c 2019-12-12
12 c 2019-12-24
'order_date'已被订购。我想知道不同订单的不同用户的日期差异。我需要使用“ groupby”来分隔用户,然后计算datediff。结果应为:
user_id datediff
0 a NA
1 a 102
2 a 20
3 a 2
4 a 25
5 b NA
6 b 134
7 b 2
8 b 152
9 c NA
10 c 132
11 c 2
12 c 12
我知道如何通过使用幼稚的循环。如何以更好的方式(如平移或滚动)获得它?顺便说一句,您不必获得完全相同的结果。“ NA”可以是“ NAT”。“ 102”可能是“ 102天”。
此外,如何获取不同用户的datediff方法?结果应为:
user_id mean_datediff
0 a 37.25
1 b 68.00
2 c 48.67
对于用户a,平均值为(102 + 20 + 2 + 25)/4=37.25,而不是149/5。
最后一步是将“ mean_datediff”添加到原始df中。预期输出为:
user_id order_date mean_datediff
0 a 2018-01-17 37.25
1 a 2018-04-29 37.25
2 a 2018-05-19 37.25
3 a 2018-05-21 37.25
4 a 2018-06-15 37.25
5 b 2018-09-18 68.00
6 b 2019-01-30 68.00
7 b 2019-02-01 68.00
8 b 2019-07-03 68.00
9 c 2019-07-31 48.67
10 c 2019-12-10 48.67
11 c 2019-12-12 48.67
12 c 2019-12-24 48.67
使用DataFrameGroupBy.diff
的差异,Series.dt.days
对转换timedeltas到天:
df['order_date'] = pd.to_datetime(df['order_date'])
df['datediff'] = df.groupby(['user_id'])['order_date'].diff().dt.days
print (df)
user_id order_date datediff
0 a 2018-01-17 NaN
1 a 2018-04-29 102.0
2 a 2018-05-19 20.0
3 a 2018-05-21 2.0
4 a 2018-06-15 25.0
5 b 2018-09-18 NaN
6 b 2019-01-30 134.0
7 b 2019-02-01 2.0
8 b 2019-07-03 152.0
9 c 2019-07-31 NaN
10 c 2019-12-10 132.0
11 c 2019-12-12 2.0
12 c 2019-12-24 12.0
并在必要时添加的整数Series.astype
带Int64
,工作大熊猫0.24+:
df['order_date'] = pd.to_datetime(df['order_date'])
df['datediff'] = df.groupby(['user_id'])['order_date'].diff().dt.days.astype('Int64')
print (df)
user_id order_date datediff
0 a 2018-01-17 NaN
1 a 2018-04-29 102
2 a 2018-05-19 20
3 a 2018-05-21 2
4 a 2018-06-15 25
5 b 2018-09-18 NaN
6 b 2019-01-30 134
7 b 2019-02-01 2
8 b 2019-07-03 152
9 c 2019-07-31 NaN
10 c 2019-12-10 132
11 c 2019-12-12 2
12 c 2019-12-24 12
编辑:
对于由mean
s填充的新列,请使用GroupBy.transform
lambda函数:
df['mean_datediff'] = (df.groupby(['user_id'])['order_date']
.transform(lambda x: x.diff().dt.days.mean()))
print (df)
user_id order_date mean_datediff
0 a 2018-01-17 37.250000
1 a 2018-04-29 37.250000
2 a 2018-05-19 37.250000
3 a 2018-05-21 37.250000
4 a 2018-06-15 37.250000
5 b 2018-09-18 96.000000
6 b 2019-01-30 96.000000
7 b 2019-02-01 96.000000
8 b 2019-07-03 96.000000
9 c 2019-07-31 48.666667
10 c 2019-12-10 48.666667
11 c 2019-12-12 48.666667
12 c 2019-12-24 48.666667
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句