Панды: извлекать определенный текст до или после дефиса, заканчивающийся указанными подстроками
Я очень новичок в 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