У меня есть столбец данных, содержащий текст, и я хотел бы создать новый столбец, содержащий предложения с именами, но не содержащие других предложений. Надеюсь на конечный результат, который будет выглядеть так:
Я могу идентифицировать ячейки, содержащие имена, из списка имен, но спотыкаюсь о той части, которая извлекает предложение, содержащее имя.
import re
import pandas as pd
import numpy as np
df = pd.DataFrame({
'ColumnA': ['Lorum ipsum. This is approved. Lorum Ipsum.', 'Lorum Ipsum. Send the contract to May. Lorum Ipsum.', 'Junk Mail from Brian.']
})
last_names_list = ['May','Brian']
df['last_names'] = ''
for x in last_names_list:
df['last_names'] = np.where(df['ColumnA'].str.contains(x),x,df['last_names'])
def f(x,y):
return re.findall(fr'[^.]{x}[^.]',y)
df['col_3'] = df.apply(lambda x: f(x['last_names'],x['ColumnA']), axis=1)
print(df)
Когда я печатаю фрейм данных, каждая строка с именем в df[col_3']
создает пустой список.
Любая помощь приветствуется.
Если вы не зациклены на использовании регулярных выражений, вы можете изменить ответ, представленный в этом посте SO, чтобы автоматически идентифицировать предложения, содержащие одно из имен, указанных в last_names_list
:
last_names_list = ['May','Brian']
pattern = '|'.join(last_names_list)
df[df.ColumnA.str.contains(pattern)]
Это возвращает:
ColumnA
1 Lorum Ipsum. Send the contract to May. Lorum I...
2 Junk Mail from Brian.
Код
pat = '|'.join(last_names_list)
df['col_3'] = df['ColumnA'].str.extract(rf'([^.]*?\b(?:{pat})\b.*?\.)')
дф:
Спасибо, что поделились
pattern = '|'.join(last_names_list)
— сегодня узнал что-то новое!