Python 如何计算每个客户端包含2个以上订单的数据帧中第一个订单和第二个订单之间的平均天数?

Python 如何计算每个客户端包含2个以上订单的数据帧中第一个订单和第二个订单之间的平均天数?,python,pandas,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 1211

我有一个如下所示的数据帧:

  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个订单之间的天数”,显示同一客户的不同订单之间的差异(日期时间列)。
    因此,前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_介质的第一个和第n个订单之间的天数”,并显示每个id_介质的不同订单之间的差异(日期时间列)。
    因此,前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_介质进行第二次、第三次(等)订购所需的平均时间。

首先转换为
datetime
排序
,以便计算可靠

  • 第一列我们可以使用
    groupby
    +
    ngroup
    标记每个订单,然后我们从每个人身上减去min,使他们都从1开始
  • 从第一次订单开始的天,使用
    groupby
    +
    transform
    获取每个客户的第一个日期,然后减去
  • 第三列相同,只需将
    id\u medium
    添加到分组中即可
代码: 输出:
您是对的,上一个差异有一个错误:因为索引5的客户是madinside,所以差异应该是2017-09-29-2016-08-23。谢谢,谢谢你的回复。查看您的df输出,我认为它可能不完全回答我的问题:事实上,第4行的“Num_ords”列应该是3,因为顺序是相同的(IML-0077676),有一个双项目(id_medium 1211395和1207056)。另外,“days_bet”列似乎不是我所期望的:第3行的实际值58是lisbeth19的第三阶和第二阶之间的差值,我期望第三阶和第一阶之间的差值。@rafspo我想我更理解这个问题。请查看更新
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