计算列中每对值对的列表交集

时间:2019-02-08 21:40:30

标签: pandas dataframe combinations

如果我有一个包含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]

2 个答案:

答案 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]