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
相关产品推荐
相关产品推荐

