Одно из возможных решений:
Чтобы получить имена из столбца DataFrame, определите следующую функцию:
def getNames(src, colName):
res = src.str.split(r' [\d.%]+ ?', n=1, expand=True).drop(1, 'columns')
res.set_index(res[0].str.upper(), inplace=True)
res.index.name = None
res.columns = [colName]
return res
Я заметил, что каждое название препарата может содержать «числовую часть"(пробел, последовательность цифр, включая точку или процент символ).
Таким образом, эта функция разбивает каждое имя в этом шаблоне и принимает только первый" сегмент ".
Затем обратите внимание, что существуют различия в верхнем / нижнем регистре, поэтому каждый список имен должен иметь индекс, содержащий одно и то же имя в верхнем регистре (так что будет возможно объединить оба списка имен только в индексе).
Затем вызовите эту функцию для обоих исходных столбцов:
n1 = getNames(df1.Drug_Admin_Description, 'Name')
n2 = getNames(df2.Drug_Name, 'Name2')
И, чтобы получить окончательный результат, выполните:
n1.join(n2, how='inner').drop('Name2', 'columns').reset_index(drop=True)
Существует одна разница по сравнению с желаемойрезультат, а именно Омега-3 жирные кислоты является результатом в полном тексте .
Согласно выбранному критерию это имя содержит без числовой части . Единственная цифра (3) является неотъемлемой частью имени, и после этого места нет цифр. Поэтому я думаю, что в этом случае нечего «отрезать».