如何使用Pandas groupby按用户分组生成订单序号索引列
pandas实现用户下单序号标记的修改方案
核心需求回顾
给数据集新增orders列,规则如下:
- 同一用户同一订单的所有商品行序号完全相同
- 按订单创建时间排序,用户首次下单序号为1,后续依次递增
修改后代码(两种实现可选)
方案1:简洁高效版(无需合并,一行生成结果)
如果user_id + order_completed_at即可唯一标记一笔订单,直接用该代码即可:
df['orders'] = df.groupby('user_id')['order_completed_at']\ .transform(lambda x: pd.factorize(x, sort=True)[0] + 1)
如果业务中同一用户同一时间可能有多笔不同订单,需要加上cart作为订单唯一标识,修改为:
df['orders'] = df.groupby('user_id')[['order_completed_at', 'cart']]\ .transform(lambda x: pd.factorize(zip(x['order_completed_at'], x['cart']), sort=True)[0] + 1)
方案2:逻辑清晰版(适合需要中间校验订单的场景)
# 提取所有唯一订单,按用户+订单时间排序后生成下单序号 unique_order = df[['user_id', 'order_completed_at']].drop_duplicates().sort_values(['user_id', 'order_completed_at']) unique_order['orders'] = unique_order.groupby('user_id').cumcount() + 1 # 将序号映射回原数据集 df = df.merge(unique_order, on=['user_id', 'order_completed_at'], how='left')
原代码问题说明
你原来的代码最后一级分组是按cart维度做累计计数,完全没有关联用户维度,且前面的多级分组计数逻辑完全偏离了“按用户维度统计下单次数”的需求,直接替换为上述代码即可。
内容的提问来源于stack exchange,提问作者jpeg_punk
相关产品推荐
相关产品推荐

