我有一个包含文本的数据框列,我想创建一个新列,其中包含带有名称的句子,但没有其他句子。希望最终结果如下所示:
我能够从名称列表中识别包含名称的单元格,但我在提取包含名称的句子的部分上遇到了困难。
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']
都会生成一个空列表。
任何帮助表示赞赏。
在尝试从 Pandas 数据帧列中的字符串中使用变量提取正则表达式的代码中出现错误。的
f(x, y)
函数存在问题,因为
[^.]
将匹配除句点以外的任何字符,而需要找到包含名称的整个句子。
以下是对的代码进行修复的方法:
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):
for name in last_names_list:
match = re.search(fr'[^.]*{re.escape(name)}[^.]*\.', x)
if match:
return match.group(0).strip()
return ''
df['col_3'] = df.apply(lambda row: f(row['ColumnA'], row['last_names']), axis=1)
print(df)
说明:
-
使用
re.escape(name)
: 这对于确保正则表达式正确处理名称中的任何特殊字符(例如“.”或“*”)至关重要。 -
找到包含名称的整个句子:
正则表达式
[^.]*{re.escape(name)}[^.]*\.
查找以下内容: -
[^.]*
:任何数量的非句点字符。 -
{re.escape(name)}
:提供的名称。 -
[^.]*
:任何数量的非句点字符。 -
\.
:一个句点,匹配句子的结尾。 -
使用
search
而不是findall
: 由于我们只在每个字符串中查找一个句子,因此re.search
比re.findall
更合适。 -
使用
match.group(0)
获取匹配的句子: 如果找到匹配项,match.group(0)
将返回匹配的完整句子。 - 处理未找到名称的情况: 如果在循环中没有找到名称,则该函数将返回一个空字符串。
通过这些更改,的
col_3
现在应包含包含列表中姓名的预期句子。