如何提升pandas嵌套apply的运行效率,快速移除姓名中的违规词汇
优化方案
核心思路是把多次逐行替换改成单次批量操作,从根源上减少调用次数,以下是两种无第三方依赖的实现方案:
方案1:正则批量替换(适用任意子串匹配场景)
不需要循环每个非法词执行替换,可将所有非法词拼接为单个正则匹配模式,结合pandas原生矢量化字符串方法一次性完成所有替换,调用次数从5亿次降到仅1次全量操作,性能提升2~3个数量级。
import re # 构造正则模式:先对每个非法词做转义避免特殊字符报错,用|拼接表示匹配任意一个非法词 # 若需要仅匹配完整单词,可将pattern改为 rf"\b({'|'.join(map(re.escape, illegal_words))})\b" pattern = f"({'|'.join(map(re.escape, illegal_words))})" # 用pandas原生str.replace做矢量化替换,性能远高于apply+自定义函数 names['name'] = names['name'].str.replace(pattern, '', regex=True)
方案2:集合过滤(适用完整单词匹配场景,速度更快)
如果需求是仅删除完全匹配的独立单词(不会误删姓名中包含非法词的子串),用集合查找+单词过滤的方案速度会比正则更快,集合的成员查找时间复杂度为O(1),2000个词的查找几乎无开销:
# 先把非法词转成集合提高查找效率 illegal_set = set(illegal_words) # 拆分姓名为单词列表,过滤掉非法词后重新拼接 names['name'] = names['name'].str.split().apply(lambda x: ' '.join([word for word in x if word not in illegal_set]))
内容的提问来源于stack exchange,提问作者Rafaó
相关产品推荐
相关产品推荐

