Разделить строку на основе заданной c подстроки или шаблона в pandas - PullRequest
1 голос
/ 17 января 2020

Спасибо за вашу помощь в моем предыдущем вопросе. Это было полезно.

Теперь есть еще один вопрос, на котором я застрял. Это основано на моем предыдущем вопросе. У меня есть очищенный ввод, и я хочу разделить основное название компании и поместить его в отдельный столбец на основе некоторых подстрок или шаблонов.

Вот мой ввод:

Original_Input                                                 Cleansed_Input
Iris Diagnostics, a Division of Iris International Inc         Iris Diagnostics a Division of Iris 
                                                               International Inc
GINGI-PAK a division of The Belport Co., Inc.                  GINGIPAK a division of The Belport Co Inc
Plastiflex Healthcare Division of Plastiflex Group NV          Plastiflex Healthcare Division of 
                                                               Plastiflex Group NV
Heuer International (A division of GST Corporation Limited)    Heuer International A division of GST 
                                                               Corporation Limited
Arrow International, Inc. (subsidiary of Teleflex, Inc.)       Arrow International Inc subsidiary of 
                                                               Teleflex Inc
Filtertek, B.V. (An ITW Medical Company)                       Filtertek BV An ITW Medical Company
Fitz c/o YBI                                                   Fitz co YBI

Мой ожидаемый результат is:

Original_Input                                                 Cleansed_Input
Iris Diagnostics, a Division of Iris International Inc         Iris Diagnostics a Division of Iris International Inc
GINGI-PAK a division of The Belport Co., Inc.                  GINGIPAK a division of The Belport Co Inc
Plastiflex Healthcare Division of Plastiflex Group NV          Plastiflex Healthcare Division of Plastiflex Group NV
Heuer International (A division of GST Corporation Limited)    Heuer International A division of GST Corporation Limited
Arrow International, Inc. (subsidiary of Teleflex, Inc.)       Arrow International Inc subsidiary of Teleflex Inc
Filtertek, B.V. (An ITW Medical Company)                       Filtertek BV An ITW Medical Company
Fitz c/o YBI                                                   Fitz co YBI

Parent_company
Iris Diagnostics
GINGIPAK 
Plastiflex Healthcare 
Heuer International
Arrow International Inc 
Filtertek BV
Fitz 

Таким образом, строка или слова перед 'A Division of', 'Division of', '(a', '(an', 'филиал', 'C / O' должны быть взято и помещено как Parent_company.

Я использовал следующий фрагмент кода:

data['Parent_Company'] = re.sub('A division of','',str(data['Cleansed_Input']))

Не получается требуемый вывод. Я хочу, чтобы строка из этих разделителей заканчивалась как пустая и только название компании, которая будет размещена, или же нужно, чтобы имена перед этими разделителями были разделены и помещены как Parent_company.

Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 17 января 2020

Вы можете сделать это с помощью регулярного выражения. Примерно так должно работать:

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(), равное (.*?), и удаляем завершающие пробелы.

...