【发布时间】:2019-09-13 10:56:44
【问题描述】:
版本 1:
import string, pandas as pd
def correct_contraction1(x, dic):
for word in dic.keys():
if word in x:
x = x.replace(word, " " + dic[word]+ " ")
return x
版本 2:
import string, pandas as pd
def correct_contraction2(x, dic):
for word in dic.keys():
if " " + word + " " in x:
x = x.replace(" " + word + " ", " " + dic[word]+ " ")
return x
我如何使用它们:
train['comment_text'] = train['comment_text'].apply(correct_contraction1,args=(contraction_mapping,))
#3 mins 40 sec without that space thing (version1)
train['comment_text'] = train['comment_text'].apply(correct_contraction2,args=(contraction_mapping,))
#5 mins 56 sec with that space thing (version2)
为什么会有如此大的速度差异,这不太可能是这种情况,其次是任何更好/隐藏的 pandas 技巧来进一步优化这一点? (代码已经在 Kaggle Kernels 上测试过多次)
-
train是一个数据框,在这两种情况下都有 200 万行,也完全相同 -
contraction_mapping是一个字典映射...(两种情况都一样) - 希望有最新的熊猫。
编辑
- 数据来自Kaggle Comp,版本 1 更快!
【问题讨论】:
-
是否可以创建一些数据样本进行测试?
-
当然,使用的数据来自这里的kaggle comp kaggle.com/c/jigsaw-unintended-bias-in-toxicity-classification/…
-
在版本 1 中,您为每个“for”创建并添加字符串,但在版本 2 中,您“仅当”时才这样做?
-
我认为第一个版本是两者中的更快?
-
(1) 您的代码不必要地一遍又一遍地重新计算
" " + word + " "。您不妨将空格放在字典键中。 (2) 测试if word in x:是多余的。无论如何,对replace()的调用必须进行存在检查。
标签: python regex python-3.x pandas