Панды: извлекать определенный текст до или после дефиса, заканчивающийся указанными подстроками

Я очень новичок в pandas и есть 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 это что-то вроде ниже:

Есть ли простой способ извлечь эти подстроки в один столбец. Название мельницы иногда может быть до, а иногда после "-", но почти всегда заканчивается на пальмовое масло, POM или Mill.

3 ответа

Решение

IIUC, вы можете использовать str.contains с этими ключевыми словами пальмовое масло мельница,POM, мельница

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  

Вы хотите разделить дефис (если есть) и вернуть подстроку, заканчивающуюся на '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

Предыдущее решение: вы можете использовать .str.split() и сделать это: df.mill = df.mill.str.split(' –').str[0],

Обновление: видя, что у вас есть несколько ограничений, вы можете создать свою собственную возвращаемую функцию (называемую func ниже) и поместите туда любую логику, какую захотите. Это перебирает все строки, разделенные на - и если Милль в первом слове вы вернетесь.

В другом случае я рекомендую решение Вена.

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
Другие вопросы по тегам