如何在DataFram上加速Python apply函数

2024-10-01 09:38:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个相当大的数据集,我试图计算每个文档的情绪。我使用维德计算情绪与以下代码,但这个过程需要超过6小时运行。我正在寻找任何加快这一进程的方法。你知道吗

from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer

analyzer = SentimentIntensityAnalyzer()

%time full_trans['bsent'] = full_trans['body_text'].apply(lambda row: analyzer.polarity_scores(row))

任何想法都是很好的,因为像这样在行中循环是非常低效的。你知道吗

作为一个例子,我已经在100个观察值的小样本上运行了我的代码。替代形式代码的结果如下。我原来的代码是第一个,建议更改为列表理解是第二个。奇怪的是,这两种方法之间的性能没有提高。你知道吗

transtest = full_transx.copy(deep=True)

from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer

analyzer = SentimentIntensityAnalyzer()

%time transtest['bsent'] = [analyzer.polarity_scores(row) for row in transtest['body_text']]

%time full_transx['bsent'] = full_transx['body_text'].apply(lambda row: analyzer.polarity_scores(row))

挂壁时间:4min 11s

挂壁时间:3min 59s


Tags: 代码texttimebodyanalyzerfullrow情绪
2条回答

循环遍历numpy数组是不高效的。我建议您找到一种将函数应用于数组本身的方法。我不能试试,但也许你可以试试analyzer.polarity_scores(full_trans['body_text'].values)

我假设full_transx['body_text']是一系列字符串。在这种情况下,在底层numpy数组上循环以构建列表通常效率更高:

full_trans['bsent'] = [analyzer.polarity_scores(row) for row in full_trans['body_text'].values]

相关问题 更多 >