Не уверен, что это быстрее, но это альтернатива:
a.str.partition(' ').iloc[:,0].replace(*zip(*b))
Результат:
0 Old
1 New
2 None
3 Varanasi
Name: 0, dtype: object
Обновление для начальных значений, содержащих пробелы :
to_replace,value = zip(*b)
to_replace = [f'^{x}.*$' for x in to_replace]
a.replace(to_replace, value, regex=True)
Пример:
a = pd.Series(['New Delhi', 'Old Bombay', None, 'Banaras', 'Greater city'])
b = [('New','Old'), ('Old','New'),('Banaras','Varanasi'), ('abc','xyz'), ('Greater city', 'Great' )]
Результат:
0 Old
1 New
2 None
3 Varanasi
4 Great
dtype: object