【发布时间】:2019-02-28 22:40:05
【问题描述】:
给定下面的示例数据框,如何在同一位置找到具有相同兴趣的用户?数据是-
userid interest location
1 [A, B] Z
2 [A, C, B] Y
3 [B, D] Z
4 [A, C] Y
5 [A, B, D] Z
输出应该是-
userid relativeid common interest location
1 3 [B] Z
1 5 [A, B] Z
2 4 [A,C] Y
到目前为止,我为每个位置创建了单独的数据框,如下所示-
userid interest location
1 [A, B] Z
3 [B, D] Z
5 [A, B, D] Z
代码-
dictionary = df.set_index('userid')['interest'].map(set).to_dict()
dictionary
out = pd.DataFrame(list(itertools.combinations(df.userid, 2)), columns=['userid', 'relative_id'])
out['common_interest'] = [list(dictionary[x] & dictionary[y]) for x, y in out.values]
out
但这给了我没有位置列的输出。
userid relativeid common interest
1 3 [B]
1 5 [A, B]
问题: 1)如何修改此代码以获取输出中的位置列? 2) 有没有办法做到这一点,而无需根据位置将原始数据帧拆分为多个数据帧?
【问题讨论】:
-
3和5有共同的B
-
@Wen-Ben yes 3 和 5 有共同的 B
-
你能解释一下“在同一地点的共同兴趣”是什么意思吗?您是否只对比较具有相同位置值的用户感兴趣?用户 ID 和位置之间是否存在 1:1 的关系?因为如果它是 1:1,并且您没有将用户 1 和 2 相互比较(例如,位于不同位置的用户),您应该能够通过用户 ID 将位置列合并到最终数据帧中。
-
@AlexK 我有多个用户,他们的兴趣(存储在列表中)和他们的位置(他们居住的国家)。例如,我总共有 10 个用户,5 个来自位置 X,3 个来自位置 Y,2 个来自位置 Z,我想编写一个 python 程序来计算位置 X、Y 和 Z 的用户,然后将每个用户与每个用户进行比较同一位置的其他用户找出他们的共同兴趣。我的代码为每个新位置创建一个新的 df,并将具有相同位置的人聚集在该 df 中。我想在不为每个新位置创建新 df 的情况下执行此操作。
标签: python pandas dictionary combinations itertools