Вычисление перекрытия элементов на основе другого столбца, панды - PullRequest
2 голосов
/ 11 июля 2019

Если у меня есть датафрейм в форме:

 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, но мне не ясно, как я могу это сделать с сгруппированными данными.

1 Ответ

3 голосов
/ 11 июля 2019

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...