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

DataFrame规模增大时Pandas移除URL操作变慢的问题求助

解决DataFrame批量移除URL的性能卡顿问题

问题根源

你用的原正则表达式嵌套了多层捕获组与递归结构,Python标准库的re引擎是回溯型实现,处理大量文本时会触发指数级回溯,导致10万条数据时性能急剧下降。分块循环没用是因为每个块仍在执行低效的正则匹配,还额外增加了循环开销。

优化方案

1. 简化正则表达式(最直接有效)

用更简洁、无嵌套的正则替代原复杂规则,避免不必要的回溯。以下正则能覆盖绝大多数常见URL,且性能提升显著:

import time
import pandas as pd

t1 = time.time()
# 简化版URL匹配正则:匹配http/https开头或www.开头的连续非空白字符
simple_url_regex = r"https?://\S+|www\.\S+"
df_mdr_pd['str_val1'] = df_mdr_pd['str_val'].str.replace(simple_url_regex, '', regex=True)
print(f"耗时: {time.time() - t1:.2f}秒")

如果需要覆盖带端口、子域名等更多场景,可微调正则(仍保持无嵌套):

simple_url_regex = r"https?://(?:www\.)?[^\s]+|www\.[^\s]+"

2. 使用高性能正则引擎

若简化正则后仍不够快,可改用Google开源的re2引擎(非回溯型,处理大量数据时速度远超Python标准re):

  • 先安装依赖:pip install re2
  • 代码示例:
import re2
import time
import pandas as pd

def remove_urls(text):
    return re2.sub(r"https?://\S+|www\.\S+", '', text)

t1 = time.time()
df_mdr_pd['str_val1'] = df_mdr_pd['str_val'].apply(remove_urls)
print(f"耗时: {time.time() - t1:.2f}秒")

3. 预处理过滤(可选)

先筛选出包含URL的行再处理,减少无效计算:

# 先标记含URL的行
mask = df_mdr_pd['str_val'].str.contains(r"https?://|www\.")
# 仅对含URL的行执行替换
df_mdr_pd.loc[mask, 'str_val1'] = df_mdr_pd.loc[mask, 'str_val'].str.replace(simple_url_regex, '', regex=True)
# 其余行直接复制原内容
df_mdr_pd.loc[~mask, 'str_val1'] = df_mdr_pd.loc[~mask, 'str_val']

内容的提问来源于stack exchange,提问作者Maria

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 18:40:38