【问题标题】:pandas performance:text column replacement is slowpandas 性能:文本列替换很慢
【发布时间】:2022-01-14 02:29:39
【问题描述】:

我有一个包含 250,000 个条目的大型数据集,我正在处理的文本列包含一个句子是每一行。

import pandas as pd
import spacy
nlp = spacy.load('en_core_web_sm')
from faker import Faker
fake = Faker()

df = pd.read_csv('my/huge/dataset.csv')
(e,g) -->  df = pd.DataFrame({'text':['Michael Jackson was a famous singer and songwriter.']})

因此,我试图从文本文件中查找人名,并将其替换为 faker 库中的假名,并将结果添加到新列中,如下所示。

person_list = [[n.text for n in doc.ents] for doc in nlp_news_sm.pipe(df.text.values) if [n.label_ == 'PER' for n in doc.ents]]
flat_person_list = list(set([item for sublist in person_list for item in sublist]))
fake_person_name = [fake.name() for n in range(len(flat_person_list))]
name_dict = dict(zip(flat_person_list, fake_person_name))

df.name = df.text.replace(name_dict, regex=True)

问题是它需要很长时间才能运行,我不知道如何提高代码的性能,所以它可以运行得更快。

【问题讨论】:

  • 首先,尝试使用regex=False。那么,你的替换名称字典有多大?
  • 您也可以将问题重命名为 pandas text replace performance。
  • 感谢您的回复。 peron_list 有 163784 个元素,因此 dict 具有几乎相同数量的键,并且值也相同 spacy pipline 运行速度也非常慢,我想这是因为我使用了很多列表理解。

标签: python pandas list performance


【解决方案1】:

好的,感谢Florian C 的评论,我想我找到了在熊猫中进行文本替换的更好方法。 Spacy模型仍然需要很多时间,但是那部分我无法更改,但是我决定使用map和lambda代替str.replace,所以现在最后一行如下:

df.name = df.text.map(lambda x:name_dict.get(x,x))

【讨论】:

    猜你喜欢
    • 2020-07-29
    • 1970-01-01
    • 2016-07-16
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 2018-09-07
    • 1970-01-01
    相关资源
    最近更新 更多