Вы можете сделать это с помощью регулярного выражения. Примерно так должно работать:
import pandas as pd
import re
def get_parent_company(input):
keywords = ["a division of", "co", "subsidiary of", "division of","an"]
regex = r"(.*?)(\b{}\b)".format("\\b|\\b".join(keywords))
matches = re.finditer(regex, input, re.IGNORECASE)
for match in matches:
return match.group(1).strip()
df["Parent_Company"] = df["Cleansed_Input"].apply(get_parent_company)
print(df)
Вывод:
Cleansed_Input Parent_Company
0 Iris Diagnostics a Division of Iris Internatio... Iris Diagnostics
1 GINGIPAK a division of The Belport Co Inc GINGIPAK
2 Plastiflex Healthcare Division of Plastiflex G... Plastiflex Healthcare
3 Heuer International A division of GST Corporat... Heuer International
4 Arrow International Inc subsidiary of Teleflex... Arrow International Inc
5 Filtertek BV An ITW Medical Company Filtertek BV
6 Fitz co YBI Fitz
Объяснение
Конечное регулярное выражение выглядит так:
(.*?)(\ba division of\b|\bco\b|\bsubsidiary of\b|\bdivision of\b|\ban\b)
(.*?)
- это группа захвата, которую мы хотим. Это означает, что все символы .*
, но только как можно меньше ?
. Это необходимо, чтобы оно соответствовало первому случаю. В противном случае наше совпадение для
GINGIPAK a division of The Belport Co Inc
будет
GINGIPAK a division of The Belport
Поскольку последнее совпадение будет Co
, что также является одним из наших ключевых слов, но мы хотим сопоставить первое a division of
.
Все остальные ключевые слова, которые мы хотим, с ИЛИ |
, чтобы оно соответствовало любому из них. Мы ставим \b
до и после, чтобы оно совпадало с точным словом, иначе совпадение для
Heuer International A division of GST Corporation Limited
будет
Heuer International A division of GST
, потому что в корпорации у нас есть co, но мы только хочу сопоставить со всем в целом.
И в конце мы берем первое совпадение match.group(1).strip()
, равное (.*?)
, и удаляем завершающие пробелы.