#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