繁体   English   中英

根据pandas中的特定子字符串或模式拆分字符串

[英]Split a string based on specific substring or pattern in pandas

感谢您对我上一个问题的所有帮助。 它很好用。

现在还有另一个问题。 它基于我之前的问题。 我有我的清理输入,我想拆分主要公司名称并根据某些子字符串或模式将其放在单独的列中。

这是我的输入:

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

我的预期输出是:

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', 'subsidiary of', 'C/O' 之前的字符串或单词应该被视为Parent_company。

我使用的一段代码如下:

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

我没有得到所需的输出。 我希望来自这些分隔符的字符串以空白结尾,并且只放置公司名称,或者希望将这些分隔符之前的名称拆分并放置为 Parent_company。

在此先感谢您的帮助。

您可以使用正则表达式来实现。 这样的事情应该工作:

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 .

剩下的就是我们想要的所有带有 OR |的关键字以便它匹配其中任何一个。 我们将\\b放在前后,以便它匹配确切的单词,否则匹配

Heuer International A division of GST Corporation Limited

将是

Heuer International A division of GST 

因为在Corporation我们有co,但我们只想匹配co作为一个整体。

最后,我们取第一个匹配项match.group(1).strip() ,即(.*?)并删除结尾的空格。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM