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

标签 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 下第二次、第三次(等等)订单平均需要多长时间。

最佳答案

首先转换为datetimesort 所以计算是可靠的。

  • 第一列我们可以使用groupby + ngroup来标记每个订单,然后我们从每个人中减去min,所以他们都从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

关于python - 如何计算每个客户包含超过 2 个订单的数据框中第一个订单和第二个订单之间的平均天数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58030857/

相关文章:

python - 在 Jinja 2 中使用变量作为字典键

python - 如何过滤或删除包含 pandas 列表中值的行

python - DataFrame 列名称内的换行符

python - 使用 Python 将变量写入 csv 行

python - 不可散列类型 : 'list'

python - 如何将外键提交到表单中? python /Django

python - 如何从 python 中的拟合 scikit 生存模型解释 .predict() 的输出?

python - 使用多个索引标签绘制的 Pandas

python - 如何在 Python 中对 Pandas 数据框上的行执行 FIFO 推送操作?

python - 如何在 Pandas 中扩展和创建以下数据集