从我的分析中,我可以看到这个函数需要更多的时间来处理。如何加快这段代码的速度?我的数据集有超过一百万条记录,我在这里给出的这个停用词列表只是一个示例 - 它实际上包含 150 个单词。
def remove_if_name_v1(s):
stopwords = ('western spring','western sprin','western spri','western spr','western sp','western s',
'grey lynn','grey lyn','grey ly','grey l')
for word in stopwords:
s = re.sub(r'(' + word + r'.*?|.*?)\b' + word + r'\b', r'\1', s.lower(), 1)
return s.title()
test.new_name = test.old_name.apply(lambda x: remove_if_name_v2(x) if pd.notnull(x) else x)
似乎该函数针对数据帧中的每一行运行,并且在每一行中,它运行 for 循环的次数与停用词的次数相同。有没有其他方法?
我在这里尝试做的是示例,如果字符串包含“western spring road west spring”,则该函数将返回“western spring road”。
谢谢。
最佳答案
您可以组合并预编译正则表达式以获得相当大的改进。
stopwords = ('western spring',
'western sprin',
'western spri',
'western spr',
'western sp',
'western s',
'grey lynn',
'grey lyn',
'grey ly',
'grey l')
pat = re.compile(r'(?P<repl>(?P<word>{stopwords}).*?|.*?)\b(?P=word)\b'.format(
stopwords='|'.join(re.escape(s) for s in stopwords)))
test.old_name.str.replace(pat, '\g<repl>')
注意(?P=word)
反向引用。我还使用了 Series.str.replace
而不是 Series.apply
,后者稍微干净一些。
关于python - 加速这个 for 循环 - python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45092752/