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

时间:2019-09-20 15:00:02

标签: python pandas

我有一个如下数据框:

  id_cliente    id_ordine data_ordine id_medium
0  madinside  IML-0042758  2016-08-23   1190408
1  lisbeth19  IML-0071225  2017-02-26   1205650
2  lisbeth19  IML-0072944  2017-03-15   1207056
3  lisbeth19  IML-0077676  2017-05-12   1211395
4  lisbeth19  IML-0077676  2017-05-12   1207056
5  madinside  IML-0094979  2017-09-29   1222195
6  lisbeth19  IML-0099675  2017-11-15   1211446
7  lisbeth19  IML-0099690  2017-11-15   1225212
8  lisbeth19  IML-0101439  2017-12-02   1226511
9  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阶之间的天数” ,并显示“ data_ordine” 的区别(日期时间列)之间,每个 id_medium
    因此前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-09-29-2017-09-29)。

最后,我想计算一个客户平均要花多长时间才能完成第二个订单,第三个订单,第四个订单等等。
以及客户对同一个id_medium进行第二,第三(等)订单的平均时间。

1 个答案:

答案 0 :(得分:2)

首先转换为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