Создайте обратное сопоставление кодов с ненулевыми именами, затем используйте это для сопоставления отсутствующих значений:
mapping = dict(df.dropna()[['code', 'name']].values)
# mapping = df.set_index('code')['name'].dropna().to_dict()
df['name'] = df['name'].fillna(df['code'].map(mapping))
df
name code
0 A 12
1 B 39
2 C 23
3 A 12
4 A 12
5 B 39
6 C 23
7 B 39
Вы также можете выполнить обновление на месте.
df['name'].update(df['code'].map(mapping))
df
name code
0 A 12
1 B 39
2 C 23
3 A 12
4 A 12
5 B 39
6 C 23
7 B 39