Попробуйте:
df.assign(col4 = df.apply(lambda row: row[row.first_valid_index()], axis=1))
Вывод:
col1,col2,col3,col4
0 1.0 NaN NaN 1.0
1 NaN 3.0 NaN 3.0
2 4.0 NaN 5.0 4.0
3 6.0 8.0 NaN 6.0
df.assign(col4 = df.apply(lambda row: row.first_valid_index(), axis=1))
Это даст вам:
col1,col2,col3,col4
0 1.0 NaN NaN col1,
1 NaN 3.0 NaN col2,
2 4.0 NaN 5.0 col1,
3 6.0 8.0 NaN col1,
Используя эту информацию, вы можете присвоить значения.
Лучшее использование:
df['col4'] = df.apply(
lambda row: row[row.first_valid_index()] if np.isnan(row['col4']) else row['col4'],
axis=1
)
Это даст вам желаемый результат (так как мы должны заполнить NaN из col4)
col1,col2,col3,col4
0 1.0 NaN NaN 1.0
1 NaN 3.0 NaN 3.0
2 4.0 NaN 5.0 4.0
3 6.0 8.0 NaN 9.0