如果我有一个包含2列user_id及其兴趣的数据集,并且我想找到有共同兴趣的用户,该怎么办?例如,我将获取第一个用户及其兴趣,并将其与其他所有用户的共同兴趣进行比较,然后,将获取第二个用户并将其兴趣与所有其他用户的兴趣进行比较,等等。...
我的数据如下:
userid interest
1 [A, B]
2 [A, C, B]
3 [B, D]
我不确定该怎么做-
for i in range(0,3):
for j in range(i+1, 3):
print((df['interest'].loc[i]).intersection(df['interest'].loc[j]))
我的输出应该是-
userid relativeid common interest
1 2 [A, B]
1 3 [B]
2 3 [B]
答案 0 :(得分:1)
这是我要解决的方法,有人可能会更喜欢pandas
。
from itertools import combinations
cs = combinations(df.userid.values, 2)
output = pd.DataFrame(list(cs), columns=['userid', 'relativeid'])
print(output)
userid relativeid
0 1 2
1 1 3
2 2 3
def intersect(row):
p1 = df.loc[df.userid == row['userid'], 'interest'].values[0]
p2 = df.loc[df.userid == row['relativeid'], 'interest'].values[0]
return list(set(p1).intersection(set(p2)))
output.assign(common_interest=output.apply(intersect, axis=1))
userid relativeid common_interest
0 1 2 [B, A]
1 1 3 [B]
2 2 3 [B]
答案 1 :(得分:1)
使用字典执行查找。然后,您可以使用itertools.combinations
查找“ userid”的组合,然后仅对每个“ userid”列表对执行设置交集。
import itertools
m = df.set_index('userid')['interest'].map(set).to_dict()
m
# {1: {'A', 'B'}, 2: {'A', 'B', 'C'}, 3: {'B', 'D'}}
out = pd.DataFrame(
itertools.combinations(df.userid, 2), columns=['userid', 'relativeid'])
out['common_interest'] = [list(m[x] & m[y]) for x, y in out.values]
out
userid relativeid common_interest
0 1 2 [B, A]
1 1 3 [B]
2 2 3 [B]