Используйте mask
с ffill
для прямого заполнения и проверки непропущенных значений с обратным заполнением:
df = df.mask(df.ffill().notnull(),df.bfill())
Или numpy.where
с DataFrame
конструктор:
df = pd.DataFrame(np.where(df.ffill().notnull(),df.bfill(), df),
index=df.index,
columns=df.columns)
print (df)
A B C
0 1.0 1.0 NaN
1 2.0 1.0 1.0
2 3.0 NaN 3.0
3 4.0 NaN 4.0
4 4.0 NaN 4.0
5 5.0 NaN 4.0