Вы можете использовать
df['Year'] = df['Year'].astype(str).str.replace(r'\b\d{2}\b',
lambda x: '20{}'.format(x.group()) if int(x.group()) < 21 else '19{}'.format(x.group()))
С интерполяцией строк:
df['Year'] = df['Year'].astype(str).str.replace(r'\b\d{2}\b',
lambda x: f'20{x.group()}' if int(x.group()) < 21 else f'19{x.group()}')
Шаблон \b\d{2}\b
соответствует двум цифрам, не предшествующим и не сопровождаемым символами (буквы, цифры или * 1008). *) и объект данных о совпадении передается в лямбду, где логика c имеет следующий вид: если совпадающие две цифры меньше 21, значение совпадения добавляется к 20
и возвращается как дата XXI века, в противном случае значение совпадения добавляется к 19
в качестве даты XX века.
Pandas тест:
df = pd.DataFrame({'Year': ['Text:21', 'More-78', 'Now:19']})
df['Year'] = df142['Year'].astype(str).str.replace(r'\b\d{2}\b',
lambda x: '20{}'.format(x.group()) if int(x.group()) < 21 else '19{}'.format(x.group()))
df
# =>
# 0 Text:1921
# 1 More-1978
# 2 Now:2019