Проблема слияния заключается в том, что оба кадра данных имеют столбец 'b', но в левой и правой версиях имеются NaN в несоответствующих местах.Вы хотите избежать получения нежелательных множественных столбцов «b» «b_x», «b_y» из merge
, во-первых, :
- нарезать неиспользуемые столбцы «a», «e 'из df1
- do
merge(df2, 'left')
, это выберет' b 'из правильного кадра данных (так как он существует только в правильном df) - наконец, выполните
df1.update(...)
, это обновит NaN в столбце 'b', взятом из df2, с df1['b']
Решение:
df1.update(df1[['a', 'e']].merge(df2, 'left'))
df1
a b e
0 1 0.0 a
1 2 1.0 1
2 3 0.0 2
3 4 1.0 b
Примечание: Поскольку я использовал merge(..., how='left')
, я сохраняю порядок строк вызывающего фрейма данных.Если бы мои df1
имели значения a
, которые были бы не в порядке
a b e
0 1 0.0 a
1 2 1.0 1
2 4 1.0 b
3 3 NaN 2
Результатом было бы
df1.update(df1[['a', 'e']].merge(df2, 'left'))
df1
a b e
0 1 0.0 a
1 2 1.0 1
2 4 1.0 b
3 3 0.0 2
, что соответствует ожиданиям.
Далее ...
Если вы хотите быть более точным, когда может быть задействовано больше столбцов
df1.update(df1.drop('b', 1).merge(df2, 'left', 'a'))
Еще дальше ...
Если вы неТ update
датафрейм, мы можем использовать combine_first
Быстрый
df1.combine_first(df1[['a', 'e']].merge(df2, 'left'))
Явный
df1.combine_first(df1.drop('b', 1).merge(df2, 'left', 'a'))
ДАЖЕ ДАЛЕЕ! ...
'left'
merge
может сохранять порядок, но НЕ индекс.Это ультраконсервативный подход:
df3 = df1.drop('b', 1).merge(df2, 'left', on='a').set_index(df1.index)
df1.combine_first(df3)