我有一个数据框,该数据框的第一列中名为“ original_column”。
我已经成功地从带有列表的文本列“ original_column”中选择了特定的单词,并将它们附加到另一列,并使用以下代码将其从原始列中删除:
list1 = {’text’ , ‘and’ , ‘example’}
finder = lambda x: next(iter([y for y in x.split() if y in list1]), None)
df['list1'] = df.original_column.apply(finder)
df['original column']=df['original column'].replace(regex=r'(?i)'+ df['list1'],value="")
我现在想在此代码的基础上,通过将列出的单词附加到新列之后,才能够从“ original_column”中删除列表中特定单词的第一个实例。
当前数据帧如下所示:
| original column |
__________________________
| text text word |
--------------------------
| and other and |
我当前的代码输出如下:
| original column | list1
______________________________
| word | text
------------------------------
| other | and
我希望输出以下内容:
| original column | list1
_______________________________
| text word | text
-------------------------------
| other and | and
答案 0 :(得分:1)
要匹配第一个模式出现并删除它,而不必在第一次出现之前删除文本,则可以使用
^(.*?)pattern
,并将其替换为对捕获组值的后向引用,这里为 \1
。
您可以将list1
列表中的所有单词匹配为整个单词(使用\b(?:word1|word2|wordN)\b
样式),并使用(?s)^(.*?)
样式匹配最不匹配的所有文字从字符串开头算起的所有字符数。
使用
df['original column'] = df['original column'].str.replace(rf"(?s)^(.*?)\b(?:{'|'.join(list1)})\b", r"\1").str.strip()
使用的正则表达式是
(?s)^(.*?)\b(?:text|and|example)\b
请参见regex demo。
详细信息
(?s)
-re.DOTALL
已启用,可以让.
匹配包括换行符在内的任何字符^
-字符串的开头(.*?)
-第1组:0个或多个字符,尽可能少\b(?:text|and|example)\b
-字母数字单词列表中的整个单词(可能还包含一个字母)替换为\1
,即对第一个(也是此处)捕获组捕获的值的反向引用。