Вы можете создать словарь из строк df2 и использовать этот словарь с fillna :
import numpy as np
import pandas as pd
da1 = [[1, 'a'],
[2, np.nan],
[3, 'c']]
df1 = pd.DataFrame(data=da1, columns=['X', 'Y'])
da2 = [[1, 'a'],
[2, 'b'],
[3, np.nan],
[4, 'd']]
df2 = pd.DataFrame(data=da2, columns=['X', 'Y'])
mapping = dict(zip(df2.X, df2.Y))
df1.Y = df1.Y.fillna(df1.X.map(mapping))
print(df1)
выход
X Y
0 1 a
1 2 b
2 3 c