Pandas数据帧MODELLO列正则归一化分组至FAMIGLIA列的优化问题
优化解决方案
针对百万级DataFrame的字符串归一化需求,推荐使用Pandas矢量化字符串操作替代逐行apply,既解决原方法保留无关值的问题,又大幅提升处理效率:
步骤1:初始化目标列
先将FAMIGLIA列初始化为空值,确保只有匹配规则的行才会被赋值:
import pandas as pd df['FAMIGLIA'] = pd.NA
步骤2:定义匹配规则并批量处理
将归一化规则整理为列表,通过矢量化的str.contains和str.replace批量处理,避免Python循环的低效:
# 规则列表:(正则匹配模式, 替换模板/值) normalize_rules = [ # 匹配RC开头+数字+-+数字,提取RC开头的核心部分 (r'(RC\d+)-\d+', r'\1'), # 精确匹配"CESPRO 998 CI",替换为"RO998CI"(^$确保完全匹配,避免部分匹配干扰) (r'^CESPRO 998 CI$', 'RO998CI') ] for pattern, replacement in normalize_rules: # 筛选匹配当前规则的行 match_mask = df['MODELLO'].str.contains(pattern, na=False, regex=True) # 对匹配行执行替换并赋值 df.loc[match_mask, 'FAMIGLIA'] = df.loc[match_mask, 'MODELLO'].str.replace(pattern, replacement, regex=True)
关键优化点说明
- 效率提升:Pandas的
str系列方法基于C实现矢量化操作,相比apply逐行调用Python函数,处理190万行数据的速度可提升数倍甚至数十倍。 - 精准控制:通过
match_mask筛选目标行,仅对符合规则的行赋值,避免无关值(如'WIN')进入FAMIGLIA列。 - 正则分组支持:
str.replace原生支持正则分组引用(如\1),解决了直接用loc赋值无法使用分组的问题。
扩展建议
后续新增归一化规则时,只需在normalize_rules列表中新增元组即可,无需修改核心逻辑,维护性更强。
内容的提问来源于stack exchange,提问作者Jhonny
相关产品推荐
相关产品推荐

