Один из способов сделать это - найти, где они все равны, и использовать индексирование .lo c для замены значений в соответствующих местах
idx = (df1.name == df2.name) & (df1.age == df2.age) & (df1.gender == df2.gender)
df1.loc[idx, 'occupation'] = df2.loc[idx, 'occupation']
Вот демонстрация того, как это работает.
df1
A B C D
0 a b 1 x
1 b a 2 r
2 a c 3 q
df2
A B C D
0 a b 1 fff
1 NaN a 2 ggg
2 a c 3 hhh
Найдите, где A и B равны, и замените столбец D в df1 на столбец D в df2:
idx = (df1.A == df2.A) & (df1.B == df2.B)
df1.loc[idx, 'D'] = df2.loc[idx, 'D']
df1
A B C D
0 a b 1 fff
1 b a 2 r
2 a c 3 hhh
Для вашего следующего поста, пожалуйста, обратитесь к этому руководству о том, как создать минимально воспроизводимый образец кода .
------ РЕДАКТИРОВАТЬ -----
Если df2
имеет меньше строк, чем df1
, то вышеуказанный метод не будет работать. В этом случае вы можете сделать:
df2
A B C D
0 a b 1 fff
1 NaN a 2 ggg
Затем
dfm = df1[df1.index.isin(df2.index)]
idx = (dfm.A == df2.A) & (dfm.B == df2.B)
dfm.loc[idx, 'D'] = df2.loc[idx, 'D']
df1 = dfm.combine_first(df1)
df1
A B C D
0 a b 1.0 fff
1 b a 2.0 r
2 a c 3.0 q