如何基于含user_id与兴趣列的数据集计算两两用户兴趣交集?
实现用户对共同兴趣的配对输出
我来帮你调整代码,实现你想要的结构化输出格式~你的核心思路是对的——通过嵌套循环遍历不重复的用户对计算交集,但需要补充收集用户ID信息并整理成目标格式。下面是具体的实现方案:
步骤1:准备并预处理数据
假设你的兴趣列是列表格式,我们先把它转成集合(集合的intersection方法更适合快速计算交集):
import pandas as pd # 构造示例数据(如果你的DataFrame已存在,这步可跳过) data = { 'userid': [1, 2, 3], 'interest': [['A', 'B'], ['A', 'C', 'B'], ['B', 'D']] } df = pd.DataFrame(data) # 将兴趣列表转为集合,方便后续计算交集 df['interest'] = df['interest'].apply(set)
步骤2:遍历用户对并生成目标结果
我们可以先初始化一个空列表存储每对用户的结果,最后转成DataFrame输出:
# 初始化结果容器 result_list = [] # 遍历每一对不重复的用户(i < j 避免重复计算同一对用户) for i in range(len(df)): for j in range(i + 1, len(df)): # 获取当前用户和对比用户的ID current_user = df['userid'].iloc[i] relative_user = df['userid'].iloc[j] # 计算共同兴趣并转回列表(匹配你想要的输出格式) common_interests = list(df['interest'].iloc[i].intersection(df['interest'].iloc[j])) # 将这组数据加入结果列表 result_list.append({ 'userid': current_user, 'relativeid': relative_user, 'common interest': common_interests }) # 转成DataFrame并输出 result_df = pd.DataFrame(result_list) print(result_df)
运行结果
执行后会得到完全符合你要求的输出:
userid relativeid common interest 0 1 2 [A, B] 1 1 3 [B] 2 2 3 [B]
可选:直接打印纯文本格式
如果你不需要DataFrame,也可以跳过转换步骤,直接在循环里按格式输出:
# 先打印表头 print("userid relativeid common interest") for i in range(len(df)): for j in range(i + 1, len(df)): current_user = df['userid'].iloc[i] relative_user = df['userid'].iloc[j] common_interests = list(df['interest'].iloc[i].intersection(df['interest'].iloc[j])) print(f"{current_user} {relative_user} {common_interests}")
这样就能得到你想要的纯文本格式输出啦~
内容的提问来源于stack exchange,提问作者user11035754
相关产品推荐
相关产品推荐

