Я бы посоветовал вам взглянуть на шаг создания вашего объединенного набора данных.
При объединении наборов данных вы можете сделать это по нескольким индексам, т.е.
df = pd.merge(left, right, how='outer', on=['Name', 'Unit', 'Level'], suffixes=['', '_r'])
С помощью внешнего объединения вы собираете все наборы данных и сразу удаляете дубликаты. Осталось только объединить столбец Year, который вы можете сделать так:
df['Year'] = df[['Year', 'Year_r']].apply(lambda x: x['Year'] if (x['Year'] is not np.nan and x['Year'] != '') else x['Year_r'], axis=1)
Это заполняет пробелы, и после этого вы можете просто удалить столбец 'Year_r'.
Преимущество заключается в том, что охватываются не только значения NaN пропущенных лет, но и пропущенные годы, представленные в виде пустых строк.
Вслед за небольшим рабочим примером:
import pandas as pd
import numpy as np
left = pd.DataFrame({'Name': ['Adam', 'Beatrice', 'Crissy', 'Dumbo', 'Peter', 'Adam'],
'Unit': ['2', '4', '6', '2', '4', '12'],
'Year': ['', '2009', '1954', '2025', '2012', '2024'],
'Level': ['L1', 'L1', 'L0', 'L4', 'L3', 'L10']})
right = pd.DataFrame({'Name': ['Adam', 'Beatrice', 'Crissy', 'Dumbo'],
'Unit': ['2', '4', '6', '2'],
'Year': ['2010', '2009', '1954', '2025'],
'Level': ['L1', 'L1', 'L0', 'L4']})
df = pd.merge(left, right, how='outer', on=['Name', 'Unit', 'Level'], suffixes=['', '_r'])
df['Year'] = df[['Year', 'Year_r']].apply(lambda x: x['Year'] if (x['Year'] is not np.nan and x['Year'] != '') else x['Year_r'], axis=1)
df