如何使用pandas将同列其他行值映射为对应id的推荐结果
Pandas 实现同簇非自身ID推荐方案
前置准备
先构造与你示例一致的输入DataFrame:
import pandas as pd df = pd.DataFrame({ 'id': [12345, 67890, 45678, 98765, 12321, 98789], 'cluster': ['A']*6 })
实现方法
方法一:自连接过滤法(推荐,适合多簇、大数据量场景)
通过同簇自连接生成所有ID配对,再过滤掉自身匹配的行即可:
# 按cluster字段自连接,得到同簇下所有ID的两两组合 merge_df = df.merge(df, on='cluster', suffixes=('', '_rec')) # 剔除ID和推荐ID相同的行,重命名列名 result = merge_df[merge_df['id'] != merge_df['id_rec']].rename(columns={'id_rec': 'recommendation'}) # 可选重置索引 result = result.reset_index(drop=True)
方法二:分组爆炸法(写法简洁,适合小数据集场景)
先按簇聚合所有ID列表,再逐行过滤自身ID后炸开成多行:
# 按cluster分组,给每个ID映射当前簇的所有ID列表 df['all_ids'] = df.groupby('cluster')['id'].transform(lambda x: x.tolist()) # 逐行过滤掉自身ID,得到当前ID的推荐列表 df['recommendation'] = df.apply(lambda row: [i for i in row['all_ids'] if i != row['id']], axis=1) # 把列表炸开成多行,保留需要的字段 result = df.explode('recommendation')[['id', 'cluster', 'recommendation']].reset_index(drop=True)
两种方法输出的结果都完全符合预期,每个ID对应同簇下除自身外的所有其他ID,每条推荐单独占一行。
内容的提问来源于stack exchange,提问作者partTimeDeveloper
相关产品推荐
相关产品推荐

