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

Emi*_*mil 5 python replace list pandas

我有一个all_transcripts包含近 300 万行的大型数据集。其中一栏msgText包含书面消息。

>>> all_transcripts['msgText']

['this is my first message']
['second message is here']
['this is my third message']
Run Code Online (Sandbox Code Playgroud)

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

>>> gemeentes
['first','second','third' ... ]
Run Code Online (Sandbox Code Playgroud)

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

def replaceCity(text):
    newText = text.replace(plaatsnaam, 'woonplaats')
    return str(newText)
Run Code Online (Sandbox Code Playgroud)

所以,我想要的输出如下:

['this is my woonplaats message']
['woonplaats message is here']
['this is my woonplaats message']
Run Code Online (Sandbox Code Playgroud)

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

for plaatsnaam in gemeentes:
    global(plaatsnaam)
    all_transcripts['filtered_text'] = test.msgText.apply(replaceCity)
Run Code Online (Sandbox Code Playgroud)

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


这篇文章(查找多个字符串匹配的算法)类似,但我的问题不同,因为:

  • 这里只有一小段文本,而我有一个包含许多不同行的数据集

  • 我想要替换单词,而不仅仅是找到单词。

Dan*_*Dan 5

假设all_transcripts是一只熊猫DataFrame

all_transcripts['msgText'].str.replace('|'.join(gemeentes),'woonplaats')
Run Code Online (Sandbox Code Playgroud)

例子:

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')
Run Code Online (Sandbox Code Playgroud)

输出

0    this is my woonplaats message
1       woonplaats message is here
2    this is my woonplaats message
Run Code Online (Sandbox Code Playgroud)

  • 我在“gemeentes”中的单词周围添加了空格,所以现在它可以工作了! (2认同)
  • @emil pandas `.str.replace` 接受正则表达式,因此可能有一种更简洁的方法来查找单词。我建议保留 `gemeentes` ,但将连接从 `'|'.join(gemeentes)` 更改为 `pattern = r'\s*' + r'\s*|\s*'.join( gemeentes) + r'\s*' 然后 `.str.replace(pattern, 'woonplaats')。这样您将击中所有空白,而不仅仅是单个空格。您可能还想考虑以句号、问号等结尾的单词。但我确信,如果您在正则表达式中搜索识别整个单词,您会找到一个很好的解决方案。 (2认同)