You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何加速基于字典文本替换的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 10:43:17