如何加速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
相关产品推荐
相关产品推荐

