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

如何加速Pandas DataFrame中百万行数据的正则替换移除地点操作

性能瓶颈分析

你现有代码的慢主要来自两个核心问题:

  • 逐行apply + 嵌套遍历4万条地点列表,时间复杂度达到O(行数*地点数),百万行场景下运算量超过400亿次,属于典型的低效实现
  • 每次循环都动态生成正则表达式,没有预编译,存在大量重复的正则编译开销
优化方案

方案1:通用正则向量化优化(适合地点可能出现在字符串任意位置的场景)

将所有地点合并为单个预编译正则,配合Pandas原生向量化字符串操作,避免Python层的嵌套循环,性能可以提升几十到上百倍。
实现代码如下:

import re
import pandas as pd

# 预处理地点列表,转义正则特殊字符,避免匹配出错
escaped_locations = [re.escape(loc) for loc in locations_lookup_list]
# 合并所有地点为单个正则模式,保留词边界约束
pattern = re.compile(r'\b(' + '|'.join(escaped_locations) + r')\b')
# 直接用Pandas原生str.replace做向量化替换,strip处理多余空格
df['string_column_location_removed'] = df['string_column'].str.replace(pattern, '', regex=True).str.strip()

方案2:后缀匹配优化(适合你的场景,地点为双/三词且固定出现在字符串末尾)

从示例可以看到你的地点都在字符串末尾,完全可以用集合O(1)查找的特性做后缀匹配,性能比正则方案还要快3-5倍:

# 先把地点列表转成集合,实现O(1)时间复杂度查找
location_set = set(locations_lookup_list)

def remove_suffix_location(s):
    parts = s.split()
    # 优先匹配3词地点
    if len(parts) >= 3:
        tri_suffix = ' '.join(parts[-3:])
        if tri_suffix in location_set:
            return ' '.join(parts[:-3]).strip()
    # 再匹配2词地点
    if len(parts) >= 2:
        bi_suffix = ' '.join(parts[-2:])
        if bi_suffix in location_set:
            return ' '.join(parts[:-2]).strip()
    # 无匹配返回原字符串
    return s

df['string_column_location_removed'] = df['string_column'].apply(remove_suffix_location)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 22:45:05