如何简化重复的Pandas批量赋值代码?硬编码是否最优?
优化重复Pandas赋值代码的方案
你的逐个loc赋值写法确实冗余,维护成本高,硬编码不是最优选择。下面提供几种更简洁、易维护的实现方式:
方案1:正则匹配+字典映射
先定义关键词与产品名称的映射字典,再通过正则匹配提取对应关键词,最后映射为目标产品值。这种方法性能较好,适合大数据集:
import pandas as pd # 定义关键词到产品的映射字典 product_map = { 'Bathroom': 'Bathroom', 'Roof': 'Roofing', 'Siding': 'Siding', 'Window': 'Window', 'Water Treatment': 'Water Treatment', 'Water Heater': 'Water Heater', 'Pump': 'Pump', 'Granulator': 'Granulator', 'Plumbing': 'Plumbing', 'Door': 'Door' } # 按关键词长度倒序构建正则模式,避免短关键词优先匹配(比如防止"Water"提前匹配,覆盖"Water Treatment") pattern = '|'.join(sorted(product_map.keys(), key=lambda x: len(x), reverse=True)) # 提取匹配的关键词并映射为产品名称 df['Product'] = df['Campaign'].str.extract(f'({pattern})', expand=False).map(product_map)
方案2:使用np.select批量处理条件
将所有匹配条件和对应结果整理为列表,通过np.select一次性完成赋值,逻辑清晰直观:
import pandas as pd import numpy as np product_map = { 'Bathroom': 'Bathroom', 'Roof': 'Roofing', 'Siding': 'Siding', 'Window': 'Window', 'Water Treatment': 'Water Treatment', 'Water Heater': 'Water Heater', 'Pump': 'Pump', 'Granulator': 'Granulator', 'Plumbing': 'Plumbing', 'Door': 'Door' } # 生成条件列表和对应结果列表 conditions = [df['Campaign'].str.contains(key) for key in product_map.keys()] choices = list(product_map.values()) # 批量赋值,无匹配项设为NaN df['Product'] = np.select(conditions, choices, default=np.nan)
方案3:apply逐行匹配(适合小数据集)
如果数据集不大,也可以用apply遍历每行,找到第一个匹配的关键词并返回对应产品:
import pandas as pd import numpy as np product_map = { 'Bathroom': 'Bathroom', 'Roof': 'Roofing', 'Siding': 'Siding', 'Window': 'Window', 'Water Treatment': 'Water Treatment', 'Water Heater': 'Water Heater', 'Pump': 'Pump', 'Granulator': 'Granulator', 'Plumbing': 'Plumbing', 'Door': 'Door' } def get_product(campaign): for key, value in product_map.items(): if key in campaign: return value return np.nan df['Product'] = df['Campaign'].apply(get_product)
总结
硬编码逐个赋值的方式存在代码冗余、维护成本高的问题,新增或修改关键词时需要重复修改代码。上述方案中:
- 正则映射和
np.select性能更优,适合处理大规模数据; apply逻辑更直观,适合小数据集或需要复杂匹配逻辑的场景。
内容的提问来源于stack exchange,提问作者internet joe
相关产品推荐
相关产品推荐

