如果它包含列表中的单词,则替换 Pandas 系列中部分字符串的最快方法

Posted

技术标签:

【中文标题】如果它包含列表中的单词,则替换 Pandas 系列中部分字符串的最快方法【英文标题】:Fastest way to replace part of a string in Pandas series if it contains a word in a list 【发布时间】:2019-09-19 22:00:09 【问题描述】:

我有一个大型数据集all_transcripts,有近 300 万行。 msgText 列之一包含书面消息。

>>> all_transcripts['msgText']

['this is my first message']
['second message is here']
['this is my third message']

此外,我有一个包含 200 多个单词的列表,名为 gemeentes

>>> gemeentes
['first','second','third' ... ]

如果此列表中的某个单词包含在msgText 中,我想将其替换为另一个单词。为此,我创建了函数:

def replaceCity(text):
    newText = text.replace(plaatsnaam, 'woonplaats')
    return str(newText)

所以,我想要的输出应该是这样的:

['this is my woonplaats message']
['woonplaats message is here']
['this is my woonplaats message']

目前,我正在循环遍历列表,对于列表中的每个项目,应用replaceCity函数。

for plaatsnaam in gemeentes:
    global(plaatsnaam)
    all_transcripts['filtered_text'] = test.msgText.apply(replaceCity)

但是,这需要很长时间,因此似乎效率不高。有没有更快的方法来执行此任务?


这篇文章 (Algorithm to find multiple string matches) 类似,但我的问题不同,因为:

这里只有一小段文字,而我有一个 具有许多不同行的数据集

我想替换单词,而不仅仅是查找单词。

【问题讨论】:

您是否尝试过使用 pandas lambda 函数的正则表达式?? 【参考方案1】:

假设all_transcripts 是熊猫DataFrame

all_transcripts['msgText'].str.replace('|'.join(gemeentes),'woonplaats')

例子:

all_transcripts = pd.DataFrame([['this is my first message'],
                                ['second message is here'],
                                ['this is my third message']],
                               columns=['msgText'])
gemeentes = ['first','second','third']

all_transcripts['msgText'].str.replace('|'.join(gemeentes),'woonplaats')

输出

0    this is my woonplaats message
1       woonplaats message is here
2    this is my woonplaats message

【讨论】:

谢谢!使用此代码,它会替换每个出现的单词,即使它包含在另一个单词中。你知道是否有办法只为整个单词做这件事吗?例如。如果我有句子“这对我来说是第一次”和“第二次怎么样”,它会替换这两个句子:“这对我来说是 woonplaatstime”和“woonplaats 时间怎么样”。但是,我只想替换完全包含该单词的单词被替换的实例。因此输出将是:“这是我的第一次”和“woonplaats 时间怎么样”。你知道怎么做吗? 我在gemeentes 中的单词周围添加了空格,所以现在可以使用了! @emil pandas .str.replace 接受正则表达式,因此可能有一种更简洁的方式来查找单词。我建议可能保留gemeentes,但将连接从'|'.join(gemeentes) 更改为pattern = r'\s*' + r'\s*|\s*'.join(gemeentes) + r'\s*' and then .str.replace(pattern, 'woonplaats')。这样你会打到所有的空白,而不仅仅是单个空格。您可能还需要考虑以句号、问号等结尾的单词。但我敢肯定,如果您在正则表达式中搜索识别整个单词,您会找到一个很好的解决方案。 .str.replace(pattern, 'woonplaats') 不起作用。它仍然会替换部分单词,现在还替换单词周围的空格。你不应该使用正则表达式单词边界吗? pattern = r'\b' + '|'.join(gemeentes) + r'\b' 为我工作。

以上是关于如果它包含列表中的单词,则替换 Pandas 系列中部分字符串的最快方法的主要内容,如果未能解决你的问题,请参考以下文章

字符串中的 Pyspark 双字符替换避免某些单词而不映射到 pandas 或 rdd

如果值在列表中,则 Pandas 数据框中的重复行

如果文本列包含指定列表中的单词,则过滤 pyspark 数据框

替换保留字列表中的列文本

如果匹配列表中的项目,则替换字符串中的项目

如果不是 NAN,则用以前的值替换 Pandas 中的缺失值