为了账号安全,请及时绑定邮箱和手机立即绑定

如何计算每个客户包含超过 2 个订单的数据框中的第一个订单和第二个订单之间的平均天数?

如何计算每个客户包含超过 2 个订单的数据框中的第一个订单和第二个订单之间的平均天数?

万千封印 2022-06-02 16:32:11
我有一个如下的数据框:  id_cliente    id_ordine data_ordine id_medium0  madinside  IML-0042758  2016-08-23   11904081  lisbeth19  IML-0071225  2017-02-26   12056502  lisbeth19  IML-0072944  2017-03-15   12070563  lisbeth19  IML-0077676  2017-05-12   12113954  lisbeth19  IML-0077676  2017-05-12   12070565  madinside  IML-0094979  2017-09-29   12221956  lisbeth19  IML-0099675  2017-11-15   12114467  lisbeth19  IML-0099690  2017-11-15   12252128  lisbeth19  IML-0101439  2017-12-02   12265119  lisbeth19  IML-0109883  2018-03-14   1226511我想添加三列:第一列可以命名为“每个客户的订单数”,应该是同一客户的订单进度。所以顺序IML-0042758应该是 1,IML-0071225应该是 1,IML-0072944应该是 2,IML-0077676应该是 3,IML-0094979应该是 2,依此类推。第二列可以命名为“同一客户的第一个订单和第 n 个订单之间的天数”,并显示同一客户下的不同订单之间的“data_ordine”差异(日期时间列)。所以前 6 行的值是:0 (2016-08-23 - 2016-08-23), 0 (2017-02-26 - 2017-02-26), 17 (2017-03-15 - 2017) -02-26), 75 (2017-05-12 - 2017-02-26), 75 (2017-05-12 - 2017-02-26), 402 (2017-09-29 - 2017-02-26) .第三列可以命名为“同一 id_medium 的第一个和第 n 个订单之间的天数”,并显示每个id_medium的不同订单之间的“data_ordine”差异(日期时间列)。 所以前 6 行的值是:0 (2016-08-23 - 2016-08-23), 0 (2017-02-26 - 2017-02-26), 0 (2017-03-15 - 2017) -03-15), 0 (2017-05-12 - 2017-05-12), 58 (2017-05-12 - 2017-03-15 因为媒体“1207056”是第二次订购), 0 ( 2017 年 9 月 29 日 - 2017 年 9 月 29 日)。最后我想计算一个客户平均需要多长时间才能下第二个订单,第三个订单,第四个订单等等。以及客户为相同的 id_medium 下第二、第三(等)订单平均需要多长时间。
查看完整描述

1 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

首先转换为datetimesort因此计算是可靠的。

  • 第一列我们可以使用groupby+ngroup来标记每个订单,然后我们减去每个人的最小值,这样他们都从 1 开始

  • 从第一个订单开始的天数,使用groupby+transform获取每个客户的第一个日期,然后减去

  • 第三列是一样的,只是添加id_medium到分组中

代码:

df['data_ordine'] = pd.to_datetime(df['data_ordine']) 

df = df.sort_values('data_ordine')


df['Num_ords'] = df.groupby(['id_cliente', 'id_ordine']).ngroup()

df['Num_ords'] = df.Num_ords - df.groupby(['id_cliente']).Num_ords.transform('min')+1


df['days_bet'] = (df.data_ordine -df.groupby('id_cliente').data_ordine.transform('min')).dt.days


df['days_bet_id'] = (df.data_ordine - df.groupby(['id_cliente', 'id_medium']).data_ordine.transform('min')).dt.days

输出:

  id_cliente    id_ordine data_ordine  id_medium  Num_ords  days_bet  days_bet_id

0  madinside  IML-0042758  2016-08-23    1190408         1         0            0

1  lisbeth19  IML-0071225  2017-02-26    1205650         1         0            0

2  lisbeth19  IML-0072944  2017-03-15    1207056         2        17            0

3  lisbeth19  IML-0077676  2017-05-12    1211395         3        75            0

4  lisbeth19  IML-0077676  2017-05-12    1207056         3        75           58

5  madinside  IML-0094979  2017-09-29    1222195         2       402            0

6  lisbeth19  IML-0099675  2017-11-15    1211446         4       262            0

7  lisbeth19  IML-0099690  2017-11-15    1225212         5       262            0

8  lisbeth19  IML-0101439  2017-12-02    1226511         6       279            0

9  lisbeth19  IML-0109883  2018-03-14    1226511         7       381          102


查看完整回答
反对 回复 2022-06-02
  • 1 回答
  • 0 关注
  • 186 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号