如何加速基于字典文本替换的Pandas apply函数?(Python)
加速Pandas文本批量替换的方案
核心问题分析
你的代码效率低下的根源是两层嵌套循环:apply逐行遍历60万行数据,再在每行内循环字典的每个键执行re.sub,时间复杂度为O(N*M)(N是行数,M是字典键的数量),自然耗时极长。以下是几个高效优化方案:
方案1:向量化str.replace + 预编译正则映射
将替换字典的所有键拼接成一个匹配所有目标单词的正则表达式,利用Pandas的向量化字符串操作一次性完成替换,彻底避免Python层面的逐行循环:
import pandas as pd import re # 预编译正则:匹配所有目标单词,保留单词边界(避免部分匹配) pattern = re.compile(r'\b(' + '|'.join(re.escape(k) for k in replacement_dict.keys()) + r')\b') # 先统一转小写,再通过正则批量替换 data['text2'] = data['text'].str.lower().str.replace( pattern, lambda x: replacement_dict[x.group()] )
这个方案的优势:
- 向量化操作由Pandas内部用C实现循环,比Python层面的
apply快数倍甚至数十倍 - 仅执行一次正则匹配,而非每个键单独匹配一次
方案2:str.translate(适合纯精确单词替换)
如果你的替换逻辑无需正则边界(仅需精确匹配整词),可以用str.translate,这是Python中最快的字符串替换方法之一:
import pandas as pd # 构建翻译表:匹配小写后的键(对应原代码先转text.lower()的逻辑) trans_dict = {ord(k.lower()): v for k, v in replacement_dict.items()} data['text2'] = data['text'].str.lower().str.translate(trans_dict)
⚠️ 注意:该方法仅适用于单个字符或整词的精确替换,无法处理正则边界需求(比如无法区分"number"和"number123"中的"number"),这类场景仍需用方案1。
方案3:swifter自动优化apply(适配复杂逻辑场景)
如果必须保留apply的写法(比如替换逻辑更复杂),可以用swifter库自动判断采用向量化或并行处理:
import pandas as pd import swifter import re def replacement(row, replacement_dict): text = row['text'].lower() pattern = re.compile(r'\b(' + '|'.join(re.escape(k) for k in replacement_dict.keys()) + r')\b') return pattern.sub(lambda x: replacement_dict[x.group()], text) data['text2'] = data.swifter.apply(replacement, axis=1, args=(replacement_dict,))
不过该方案效率仍不如前两个向量化方法,仅建议用于无法简化的复杂替换场景。
效果参考
针对60万行数据,方案1通常能将处理时间从8小时压缩至几分钟甚至几十秒,方案2若适用则效率更高。
内容的提问来源于stack exchange,提问作者Sevval
相关产品推荐
相关产品推荐

