如何按用户生成连续partner_name配对,排除跨用户及单记录用户?
问题描述
数据集
| user_id | partner_name | order_sequence |
|---|---|---|
| 2 | Star Bucks | 1 |
| 2 | KFC | 2 |
| 2 | MCD | 3 |
| 6 | Coffee Store | 1 |
| 6 | MCD | 2 |
| 9 | KFC | 1 |
需求
- 按
user_id分组,同一用户内根据order_sequence生成连续的partner_name两两组合(如user_id=2对应[[Star Bucks, KFC], [KFC, MCD]]) - 跨用户的相邻记录不生成组合
- 仅拥有单条记录的用户(如user_id=9)不纳入处理
- 预期最终结果:
[[Star Bucks, KFC], [KFC, MCD], [Coffee Store, MCD]]
错误代码
用户编写的代码未得到正确结果:
arr1 = [] arr2 = [] for idx,x in enumerate(df['order_sequence']): if x!=1: arr1.append(df['partner_name'][idx]) arr1.append(df['partner_name'][idx+1]) arr2.append(arr1)
问题分析
原代码存在以下问题:
- 未按
user_id分组处理,会错误生成跨用户的组合 - 未重置
arr1,导致每次循环都往同一个列表里追加元素,生成的组合长度异常 - 未过滤只有单条记录的用户,不符合需求
- 逻辑错误:通过
order_sequence!=1判断的方式不准确,无法正确捕捉同一用户内的连续记录
正确实现方案
方法一:使用Pandas Groupby(推荐)
利用Pandas的分组功能,针对每个用户单独处理,逻辑清晰:
import pandas as pd # 构造数据集 data = [ [2, "Star Bucks", 1], [2, "KFC", 2], [2, "MCD", 3], [6, "Coffee Store", 1], [6, "MCD", 2], [9, "KFC", 1] ] df = pd.DataFrame(data, columns=["user_id", "partner_name", "order_sequence"]) result = [] # 按user_id分组遍历 for _, group in df.groupby("user_id"): # 跳过只有单条记录的用户 if len(group) < 2: continue # 确保组内记录按order_sequence排序 sorted_group = group.sort_values("order_sequence") # 生成连续两两组合 for i in range(len(sorted_group)-1): combo = [sorted_group.iloc[i]["partner_name"], sorted_group.iloc[i+1]["partner_name"]] result.append(combo) print(result) # 输出:[['Star Bucks', 'KFC'], ['KFC', 'MCD'], ['Coffee Store', 'MCD']]
方法二:纯循环遍历
如果不想使用分组功能,可先排序后逐行遍历,跟踪当前用户状态:
import pandas as pd data = [ [2, "Star Bucks", 1], [2, "KFC", 2], [2, "MCD", 3], [6, "Coffee Store", 1], [6, "MCD", 2], [9, "KFC", 1] ] df = pd.DataFrame(data, columns=["user_id", "partner_name", "order_sequence"]) # 先按user_id和order_sequence排序,确保顺序正确 df_sorted = df.sort_values(["user_id", "order_sequence"]) result = [] current_user = None prev_partner = None for _, row in df_sorted.iterrows(): user_id = row["user_id"] partner = row["partner_name"] if current_user != user_id: # 切换用户时重置状态 current_user = user_id prev_partner = partner continue # 同一用户内,生成当前与上一条记录的组合 result.append([prev_partner, partner]) prev_partner = partner print(result) # 输出:[['Star Bucks', 'KFC'], ['KFC', 'MCD'], ['Coffee Store', 'MCD']]
内容的提问来源于stack exchange,提问作者khanmazhar
相关产品推荐
相关产品推荐

