#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. Бен Т., спасибо за предложение, я внесу это изменение, и комментарий для сортировки также приветствуется.