如何按用户ID构建购买序列、生成相邻商品对并计算累计消费额
实现方法
基于pandas实现即可,核心逻辑是按用户分组后,通过偏移取相邻上一位置的商品作为前序商品,同时累计求和计算累计消费额,最后过滤掉无前置商品的首单记录。
操作步骤
- 先对原始数据排序:严格按照
user_id分组维度、sequence升序排列,避免原数据存储顺序错乱导致的配对错误 - 分组计算衍生字段:
- 对每个用户的购买序列,用
shift(1)取上一行的商品名,作为source_product - 对每个用户的消费金额做累计求和
cumsum(),得到购买到当前商品时的累计总消费
- 对每个用户的购买序列,用
- 整理输出结构:将当前行的商品字段重命名为
target_product,删除source_product为空的首条记录(首单没有相邻前序商品,不符合配对要求),保留需要的四个字段即可。
代码示例
import pandas as pd # 读取/构造你的原始数据,这里用样例数据演示 raw_df = pd.DataFrame({ 'user_id': [1,1,1,2,2,2], 'sequence': [1,2,3,1,2,3], 'product': ['A','C','G','B','T','A'], 'price': [10,15,1,20,45,10] }) # 排序固定顺序 sorted_df = raw_df.sort_values(by=['user_id', 'sequence']).reset_index(drop=True) # 分组计算字段 sorted_df['source_product'] = sorted_df.groupby('user_id')['product'].shift(1) sorted_df['cum_total_price'] = sorted_df.groupby('user_id')['price'].cumsum() # 整理成目标格式 target_df = sorted_df.rename(columns={'product': 'target_product'}) .dropna(subset=['source_product']) .loc[:, ['user_id', 'source_product', 'target_product', 'cum_total_price']] .reset_index(drop=True)
输出结果
运行后得到的target_df和你给出的目标格式完全匹配:
| user_id | source_product | target_product | cum_total_price |
|---|---|---|---|
| 1 | A | C | 25 |
| 1 | C | G | 16 |
| 2 | B | T | 65 |
| 2 | T | A | 75 |
注意:如果原始数据存在同一用户同
sequence值的多条记录,需要先按业务规则去重或聚合,否则会出现配对错位的问题。
内容的提问来源于stack exchange,提问作者titutubs
相关产品推荐
相关产品推荐

