如何使用Pandas替代for循环优化df['Состояние']字段的关键词分类
Pandas 分类标注向量化优化方案
原代码存在笔误:第二个循环中使用的
list_exp未定义,应为list_dem。
优化思路
- 摒弃逐行列表推导、逐关键词遍历的Python层循环,改用Pandas内置向量化字符串匹配(底层为C实现,大数据量下性能提升显著)
- 用正则或规则批量匹配同组关键词,无需对每个关键词单独循环
- 通过
np.select按原逻辑的优先级完成条件赋值,保证规则一致性
优化后代码
import re import numpy as np conditions = ['a', 'b'] list_rep = ['a1', 'a2'] list_dem = ['b1', 'b2'] # 提前将目标序列转为小写字符串,统一匹配规则 s = df['Состояние'].astype(str).str.lower() # 拼接匹配正则,对关键词做转义避免特殊字符匹配异常 rep_pattern = '|'.join(re.escape(kw) for kw in list_rep) dem_pattern = '|'.join(re.escape(kw) for kw in list_dem) # 按原逻辑优先级定义匹配条件 conds = [ s.str.contains(rep_pattern), # 优先级1:匹配任意rep关键词 → 标注a s.str.contains(dem_pattern), # 优先级2:匹配任意dem关键词 → 标注b s.str.contains(conditions[0]), # 优先级3:字符串包含字符a → 标注a s.str.contains(conditions[1]) # 优先级4:字符串包含字符b → 标注b ] # 对应条件的赋值结果 choices = [ conditions[0], conditions[1], conditions[0], conditions[1] ] # 未命中所有条件的统一默认置为'-' df['Состояние'] = np.select(conds, choices, default='-')
逻辑对齐说明
- 匹配优先级完全和原循环逻辑一致,后匹配的规则不会覆盖前面已经命中的结果
- 仅需2次全量字符串匹配就完成所有关键词的批量判断,无需对每个关键词单独遍历行
- 若确认关键词不存在正则特殊字符,可省略
re.escape步骤简化代码
内容的提问来源于stack exchange,提问作者Elena
相关产品推荐
相关产品推荐

