如果我有以下形式的数据框:
tag element_id
1 12
1 13
1 15
2 12
2 13
2 19
3 12
3 15
3 22
如何根据tags
计算element_id
的重叠量?我猜结果应该是以下形式的重叠矩阵:
1 2 3
1 X 2 2
2 2 X 1
3 2 1 X
我将X放在对角线上,因为标签与其自身的重叠无关紧要,并且矩阵中的数字代表两个标签共享的总element_ids
。
我的尝试:
您可以尝试使用for循环,例如:
for item in df.itertuples():
element_lst += [item.element_id]
element_tag = item.tag
# then intersect the element_list row by row.
# This is extremely costly for large datasets
我正在考虑的第二件事是使用df.groupby('tag')
并尝试以某种方式与element_id
相交,但是我不清楚如何使用分组数据来做到这一点。
答案 0 :(得分:3)
merge
+ crosstab
# Find element overlap, remove same tag matches
res = df.merge(df, on='element_id').query('tag_x != tag_y')
pd.crosstab(res.tag_x, res.tag_y)
tag_y 1 2 3
tag_x
1 0 2 2
2 2 0 1
3 2 1 0