Python:如何用字典匹配词为Series添加类型列并修复循环问题
基于关键词匹配生成客户类型列的优化方案
问题说明
需要根据预定义的关键词字典,为客户名称字段匹配对应的类型列:若客户名称包含字典中某类别的关键词,则将该类别作为新列值(例如“Oak Sheriff's Office”对应类型“POLICE”)。原代码存在两个问题:
- 匹配到关键词后无法终止循环,导致生成的行数远超原始数据
- 三层循环写法冗余,效率低
原代码问题分析
keywords = {} key_dict['POLICE'] = ['police', 'sheriff', 'safety'] key_dict['FIRE'] = ['fire', 'rescue'] for cust in renewals['customer name']: for word in keywords: for key in keywords[word]: if key in cust: df = df.append({'Type':word}, ignore_index=True) break break
- 变量名不一致:定义了空字典
keywords,但赋值和遍历的是key_dict,导致内层循环实际未执行 - 循环终止逻辑错误:
break仅跳出最内层的关键词循环,外层循环仍会继续,且每次df.append会新增一行,而非对应原数据的每行记录 - 未处理大小写:客户名称中的大写关键词(如
Sheriff)无法匹配字典中的小写关键词 - 三层循环冗余:嵌套层级过多,代码可读性和效率差
优化实现方案
利用Pandas的apply方法简化逻辑,同时修正循环终止问题,处理大小写匹配:
import pandas as pd # 统一关键词字典定义 key_dict = { 'POLICE': ['police', 'sheriff', 'safety'], 'FIRE': ['fire', 'rescue'] } def get_customer_type(cust_name): # 转为小写消除大小写影响 cust_lower = cust_name.lower() # 遍历每个类别及其关键词 for type_label, keywords in key_dict.items(): for keyword in keywords: if keyword in cust_lower: # 匹配到直接返回类别,自动终止所有循环 return type_label # 无匹配时返回默认类别 return 'OTHER' # 为原数据生成Type列,每行对应一个结果 renewals['Type'] = renewals['customer name'].apply(get_customer_type)
优化点说明
- 匹配后自动终止:找到对应关键词后通过
return直接结束函数,无需手动处理循环终止 - 对应原始数据行:通过
apply逐行处理,新列与原数据行数完全一致 - 大小写兼容:将客户名称转为小写后匹配,避免大小写导致的匹配失败
- 代码简化:逻辑清晰,去掉冗余嵌套,可读性和执行效率更高
内容的提问来源于stack exchange,提问作者wittmaaj
相关产品推荐
相关产品推荐

