Идентификация соединений «многие ко многим» в двух столбцах идентификаторов в фрейме данных Pandas?

#python #pandas #many-to-many

Вопрос:

У меня есть фрейм данных Pandas, df, с двумя столбцами идентификаторов. В этих двух столбцах похоронены наборы сопоставлений «многие ко многим», как показано в приведенном ниже примере:

 ID1         ID2

001         003
001         004
002         003
002         004
 

Я ищу опытный способ идентифицировать эти блоки и вернуть совпадения «первый — первый», «второй-второй» и т. Д.-В приведенном выше примере сопоставление 001-003 и 002-004 (хотя это не критично — оно может вернуть 001-004, а 002-003).

создание фреймов данных

  l1 = ['001','001','002','002']
 l2 = ['003','004','003','004']
 df  = pd.DataFrame(list(zip(l1,l2)),columns=['ID1','ID2'])
 df2 = pd.DataFrame(columns=['ID1','ID2'])
 

заполните второй фрейм данных идентификатором ID1 и кортежем соответствующих значений ID2

  for i in df[df.ID1.duplicated()]['ID1'].to_list():
     df2 = df2.append({'ID1':i, 'ID2':tuple(df[df['ID1']==i]['ID2'])}, ignore_index=True)

   ID1         ID2
0  001  (003, 004)
1  002  (003, 004)
 

Группируйте по кортежам и создайте кортеж ID1, в котором кортежи ID2 равны

 df2.groupby('ID2')['ID1'].apply(tuple)

ID2
(003, 004)    (001, 002)
 

Это дает мне то, что мне нужно, но это грязно и неловко, и это хорошо, только если никто не смотрит. Мои панды не блистательны — интересно, есть ли более острые инструменты для этой работы?

Заранее спасибо!

Комментарии:

1. Можете ли вы переформатировать свой код

2. Извините. Позвольте мне решить, что мне нужно сделать.

3. почему вы не использовали groupby.agg(tuple) вместо цикла for , так попробуйте это df.groupby(['ID1'])['ID2'].agg(tuple).reset_index().groupby('ID2')['ID1'].apply(tuple).reset_index() . обратите внимание, что вы можете сначала выполнить сортировку по ID2, чтобы убедиться, что кортеж упорядочен одинаково

4. Если у вас есть новая строка 001 005, каков ожидаемый результат?

5. Бен Т., спасибо за предложение, я внесу это изменение, и комментарий для сортировки также приветствуется.