如何用Python为客户购买历史分配时间顺序订单位置
为客户订单分配顺序位置的解决方案
要实现给每位客户的订单分配顺序编号(同一订单的所有商品行共用同一个编号),可以按以下步骤用Pandas完成:
核心思路
先提取每个客户的唯一订单记录,按订单日期排序后分配序号,再将序号映射回原始数据表的所有行。
实操步骤
确保日期格式正确
先把Order Date列转换成datetime类型,避免字符串排序出错:df['Order Date'] = pd.to_datetime(df['Order Date'])生成客户订单的唯一序号
提取Customer ID和Order Number的唯一组合,按客户分组后,根据Order Date的先后给每个订单分配序号:# 获取唯一的客户-订单组合,并保留订单日期 unique_orders = df[['Customer ID', 'Order Number', 'Order Date']].drop_duplicates() # 按客户分组,对订单日期排序后分配序号(dense确保序号连续) unique_orders['Order Position'] = unique_orders.groupby('Customer ID')['Order Date'].rank(method='dense', ascending=True).astype(int)将序号合并回原始数据表
用merge把生成的序号关联回原数据,保证同一订单的所有商品行都拿到相同的序号:df_final = df.merge(unique_orders[['Customer ID', 'Order Number', 'Order Position']], on=['Customer ID', 'Order Number'], how='left')
验证效果
运行上述代码后,你的示例数据会得到和预期一致的Order Position列:
| Customer ID | Order Number | Order Date | Item ID | Order Position |
|---|---|---|---|---|
| C100003 | RJSJ0053 | 2023-05-08 | Mouse | 1 |
| C100002 | RJSJ0060 | 2023-06-09 | Keyboard | 1 |
| C100002 | RJSJ0085 | 2023-06-13 | Computer | 2 |
| C100002 | RJSJ0085 | 2023-06-13 | Monitor | 2 |
| C100003 | RJSJ0089 | 2023-06-13 | Keyboard | 2 |
| C100002 | RJSJ0092 | 2023-06-14 | Headset | 3 |
关键说明
- 使用
drop_duplicates避免同一订单被多次计算序号 rank(method='dense')保证序号是连续的1、2、3...,不会因为同一天有多个订单出现跳号- 用
merge关联时,基于Customer ID和Order Number两个字段,确保匹配准确
内容的提问来源于stack exchange,提问作者RJL
相关产品推荐
相关产品推荐

