如何在DataFrame中加快Python应用功能

时间:2019-07-04 13:04:15

标签: python dataframe apply sentiment-analysis

我有一个相当大的数据集,我正在尝试计算每个文档的情绪。我正在使用Vader通过以下代码来计算情感,但是此过程需要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))

上场时间:4分11秒

上场时间:3分钟59s

2 个答案:

答案 0 :(得分:0)

我假设full_transx['body_text']是一系列字符串。在那种情况下,遍历底层的numpy数组以建立列表理解通常会更有效:

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

答案 1 :(得分:0)

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