【问题标题】:pandas: extract specific text before or after hyphen, that ends in given substringspandas:在连字符之前或之后提取特定文本,以给定的子字符串结尾
【发布时间】:2018-09-12 03:39:27
【问题描述】:

我对@9​​87654323@ 很陌生,并且有一个类似于下面的data frame

import pandas as pd 

df = pd.DataFrame({'id': ["1", "2", "3","4","5"],
                   'mill': ["Company A Palm Oil Mill – Special Company A of CC Ltd",
                            "Company X POM – Company X Ltd","DDDD Mill – Company New and Old Ltd",
                            "Company Not Special – R Mill","Greatest Company – Great World POM"]})

  id                                               mill
0  1  Company A Palm Oil Mill – Special Company A of...
1  2                      Company X POM – Company X Ltd
2  3                DDDD Mill – Company New and Old Ltd
3  4                       Company Not Special – R Mill
4  5                 Greatest Company – Great World POM

我想从上面的data frame 得到类似下面的东西:

有没有一种简单的方法可以将这些子字符串提取到同一列中。工厂名称有时可以在“-”之前,也可以在其他时间之后,但几乎总是以 Palm Oil Mill、POM 或 Mill 结尾。

【问题讨论】:

  • 这会涉及到Nltk
  • 是什么决定了你是保留连字符之前还是之后的内容?尤其是第二行并不明显。
  • "extract those substrings" 不是一个明确的问题陈述。您的意思是 " 拆分连字符(如果有),并返回以 'Mill' 或 'POM' 结尾的子字符串"
  • @smci,是的,很抱歉没有在帖子标题中明确说明。已经更新了

标签: python string pandas substring text-processing


【解决方案1】:

以前的解决方案:您可以使用 .str.split() 并执行以下操作: df.mill = df.mill.str.split(' –').str[0].

更新:看到您有一些限制,您可以构建自己的返回函数(下面称为func)并将您想要的任何逻辑放入其中。这将遍历由- 分割的所有字符串,如果 Mill 在您返回的第一个单词中。

在其他情况下,我推荐 Wen 的解决方案。

import pandas as pd 

df = pd.DataFrame({'id': ["1", "2", "3","4","5"],
                   'mill': ["Company A Palm Oil Mill – Special Company A of CC Ltd",
                            "Company X POM – Company X Ltd","DDDD Mill – Company New and Old Ltd",
                            "Company Not Special – R Mill","Greatest Company – Great World POM"]})

def func(x):
    #Split array
    ar = x.split(' – ')

    # If length is smaller than 2 return value
    if len(ar) < 2:
        return x

    # Else loop through and apply logic here
    for ind, x in enumerate(ar):
        if x.lower().endswith(('mill', 'pom')):
            return x

    # Nothing found, return x
    return x

df.mill = df.mill.apply(func)

print(df)

返回:

  id                     mill
0  1  Company A Palm Oil Mill
1  2            Company X POM
2  3                DDDD Mill
3  4                   R Mill
4  5          Great World POM

【讨论】:

  • 也许检查输出?
  • @Wen 是的,我在发帖后也看到了这个并加入了讨论。我正在编辑。
【解决方案2】:

IIUC,你可以用str.contains 和那些关键词Palm Oil Mill,POM,Mill

s = df.mill.str.split(' – ', expand=True)

df['Name']=s[s.apply(lambda x : x.str.contains('Palm Oil Mill|POM|Mill'))].fillna('').sum(1)
df
Out[230]: 
  id                                               mill  \
0  1  Company A Palm Oil Mill – Special Company A of...   
1  2                      Company X POM – Company X Ltd   
2  3                DDDD Mill – Company New and Old Ltd   
3  4                       Company Not Special – R Mill   
4  5                 Greatest Company – Great World POM   
                      Name  
0  Company A Palm Oil Mill  
1            Company X POM  
2                DDDD Mill  
3                   R Mill  
4          Great World POM  

【讨论】:

    【解决方案3】:

    您想在连字符(如果有)上拆分,并返回以 'Mill' 或 'POM' 结尾的子字符串:

    def extract_mill_name(s):
        """Extract the substring which ends in 'Mill' or 'POM'"""
        for subs in s.split('–'):
            subs = subs.strip(' ')
            if subs.endswith('Mill') or subs.endswith('POM'):
                return subs
    
        return None # parsing error. Could raise Exception instead
    
    df.mill.apply(extract_mill_name)
    
    0    Company A Palm Oil Mill
    1              Company X POM
    2                  DDDD Mill
    3                     R Mill
    4            Great World POM
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      • 1970-01-01
      • 2014-12-04
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      相关资源
      最近更新 更多