Я думаю, что наиболее логичным местом для начала является обращение вашего словаря, чтобы ваш ключ был вашей исходной строкой, которая соответствует значению вашей новой строки. Вы можете сделать это вручную или миллионами других способов, таких как:
import itertools
dict_rev = dict(itertools.chain.from_iterable([list(zip(v, [k]*len(v))) for k, v in dct.items()]))
Который не очень удобочитаемый. Или этот, который выглядит лучше, и я украл из другого ответа:
dict_rev = {v : k for k, V in dct.items() for v in V}
Для этого необходимо, чтобы каждое из значений в вашем словаре находилось в списке (или других итерируемых), например "new key": ["single_val"]
в противном случае будет взорван каждый символ в строке.
Затем вы можете сделать следующее (основываясь на приведенном здесь коде Как заменить несколько подстрок строки? )
import re
rep = dict((re.escape(k), v) for k, v in dict_rev.items())
pattern = re.compile("|".join(rep.keys()))
input_df["text"] = input_df["text"].str.replace(pattern, lambda m: rep[re.escape(m.group(0))])
Этот метод работает примерно в 3 раза быстрее, чем более простое и элегантное решение:
Simple:
%timeit input_df["text"].replace(dict_rev, regex=True)
425 µs ± 38.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Быстрее:
%timeit input_df["text"].str.replace(pattern, lambda m: rep[re.escape(m.group(0))])
160 µs ± 7.78 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)