Как объединить строки в фрейме данных, основываясь на том, содержит ли строка значение в другой строке - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть один фрейм данных, который выглядит следующим образом, с дополнительными столбцами:

ID         Paired_ID      ... 
123_1      123_2
123_2      123_1
456_1      456_2
456_2      456_1
789_1      789_2
789_2      789_1
789_3      789_4
789_4      789_3

Что я хотел бы сделать, это для конкретного идентификатора взять строку, где его Paired_ID является идентификатором, и объединить два ряда в один. Я пытался использовать pandas merge (

pd.merge(df, df, left_on="ID", right_on="Paired_ID"

, но получаю дубликаты и не могу понять, как от них избавиться.

Мне бы хотелось:

ID_x        Paired_ID_x      ID_y     Paired_ID_y  ...
123_1      123_2             123_2      123_1
456_1      456_2             456_2      456_1
789_1      789_2             789_2      789_1
789_3      789_4             789_4      789_3

1 Ответ

0 голосов
/ 27 февраля 2020

Предполагается, что каждое значение в ID находится в paired_ID.

Сравните концы после разделителя '_' и создайте два новых фрейма данных,

Конкатрируйте фреймы данных на оси столбцов в получите ваш вывод.

#this extracts the ends of each value in ID and Paired_ID
A = df.ID.str.split('_').str[-1].astype(int)
B = df.Paired_ID.str.split('_').str[-1].astype(int)

#compare, filter df based on the comparison outcome and add suffixes
filter_1 = df.loc[A.le(B)].reset_index(drop=True).add_suffix('_x')
filter_2 = df.loc[~A.le(B)].reset_index(drop=True).add_suffix('_y')

#concatenate along the columns axis to get outcome
pd.concat([filter_1,filter_2],axis=1)


    ID_x    Paired_ID_x ID_y    Paired_ID_y
0   123_1   123_2       123_2   123_1
1   456_1   456_2       456_2   456_1
2   789_1   789_2       789_2   789_1
3   789_3   789_4       789_4   789_3
...