You need to enable JavaScript to run this app. Pandas DataFrame跨列值匹配实现用户交易配对的方法咨询
优惠活动
大模型
产品
解决方案
定价
更多

Pandas DataFrame跨列值匹配实现用户交易配对的方法咨询

实现方案

核心匹配逻辑

配对关系的本质是:如果用户X的Dislike水果等于用户Y的Like水果,即X可以把自己不需要的水果交给Y,对应交易关系为From=X, To=Y。
不需要递归,仅通过字典映射关联即可实现,完全规避跨列遍历的复杂度。

具体实现

代码实现

import pandas as pd

# 复现示例数据
data = [['Ben', 'Apple', 'Banana'], ['Nancy', 'Pear', 'Apple'], ['Paul', 'Banana', 'Mango'], ['Sally', 'Mango', 'Pear']] 
df = pd.DataFrame(data, columns = ['Name', 'Like', 'Dislike']) 

# 构建Like映射:以水果为键,快速查询喜欢该水果的用户
like_map = df.set_index('Like')['Name'].to_dict()

# 遍历生成配对关系
trade_list = []
for _, row in df.iterrows():
    from_user = row['Name']
    dislike_fruit = row['Dislike']
    # 匹配到对应用户后加入交易列表
    if dislike_fruit in like_map:
        to_user = like_map[dislike_fruit]
        trade_list.append([from_user, to_user])

# 生成基础交易DataFrame
tradesDF = pd.DataFrame(trade_list, columns=['From', 'To'])

调整为示例输出顺序

默认按原表行顺序生成的结果为:

From    To
0   Ben     Paul
1   Nancy   Ben
2   Paul    Sally
3   Sally   Nancy

如需完全匹配示例的循环链排序,可执行以下代码调整:

# 定义循环顺序排序
order = ['Ben', 'Paul', 'Sally', 'Nancy']
tradesDF['order'] = tradesDF['From'].map({name: idx for idx, name in enumerate(order)})
tradesDF = tradesDF.sort_values('order').drop(columns='order').reset_index(drop=True)

最终输出结果和示例完全一致:

From    To
0   Ben     Paul
1   Paul    Sally
2   Sally   Nancy
3   Nancy   Ben

边界兼容说明

  • 若存在多个用户喜欢同一种水果,like_map默认保留最后一个匹配到的用户,可改用groupby聚合为列表存储所有匹配用户:
    like_map = df.groupby('Like')['Name'].apply(list).to_dict()
    
  • 若存在Dislike的水果没有对应用户喜欢,上述代码中的判断逻辑会自动过滤无效配对。

内容的提问来源于stack exchange,提问作者Marzo Buffon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 15:45:03