You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按用户生成连续partner_name配对,排除跨用户及单记录用户?

问题描述

数据集

user_idpartner_nameorder_sequence
2Star Bucks1
2KFC2
2MCD3
6Coffee Store1
6MCD2
9KFC1

需求

  • 按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)

问题分析

原代码存在以下问题:

  1. 未按user_id分组处理,会错误生成跨用户的组合
  2. 未重置arr1,导致每次循环都往同一个列表里追加元素,生成的组合长度异常
  3. 未过滤只有单条记录的用户,不符合需求
  4. 逻辑错误:通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 18:09:25