Как объединить два фрейма данных Панд разного размера в зависимости от условия

#python #pandas #dataframe #merge

Вопрос:

У меня есть основной df, в который я хочу влиться. Давайте назовем это «primary_df».

 RCID    TypeID    Data
 777         D    Hello
 777         O    Hey
 778         O    Hey
 779         D    Hello
 

primary_df содержит столбец «RCID», который совпадает с «O_ID» в другом фрейме данных, содержащем только данные типа «O». Давайте назовем это df «o_type_df»

 O_ID   O_Data
 777   Foo
 778   Bar
 

в o_type_df меньше записей, чем в primary_df. В primary_df есть повторяющиеся значения ‘RCID’, так как один и тот же RCID может иметь разные идентификаторы типов, связанные с ним.

Как я могу объединить o_type_df в primary_df для всех строк типа «O»?

Конечный результат должен быть:

 RCID    TypeID    Data     O_ID   O_Data
 777         D    Hello    
 777         O    Hey      777    Foo
 778         O    Hey      778    Bar
 779         D    Hello
 

Код:

 primary_df = pd.DataFrame(columns=['RCID', 'TypeID', 'Data'], data=[[777, 'D', 'Hello'], [777, 'O', 'Hey'], [778, 'O', 'Hey'], [779, 'D', 'Hello']])
o_type_df = pd.DataFrame(columns=['O_ID', 'O_Data'], data=[[777, 'Foo'], [778, 'Bar']])
 

Ответ №1:

Попробуйте добавить столбец индикатора в o_type_df :

 o_type_df['TypeID'] = 'O'
 

Затем merge налево по этим столбцам:

 merged = (
    primary_df.merge(o_type_df,
                     left_on=['RCID', 'TypeID'],
                     right_on=['O_ID', 'TypeID'],
                     how='left')
)
 

merged :

    RCID TypeID   Data   O_ID O_Data
0   777      D  Hello    NaN    NaN
1   777      O    Hey  777.0    Foo
2   778      O    Hey  778.0    Bar
3   779      D  Hello    NaN    NaN
 

Или с assign :

 merged = (
    primary_df.merge(o_type_df.assign(TypeID='O'),
                     left_on=['RCID', 'TypeID'],
                     right_on=['O_ID', 'TypeID'],
                     how='left')
)
 

merged :

    RCID TypeID   Data   O_ID O_Data
0   777      D  Hello    NaN    NaN
1   777      O    Hey  777.0    Foo
2   778      O    Hey  778.0    Bar
3   779      D  Hello    NaN    NaN