You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
  1. 变量名不一致:定义了空字典keywords,但赋值和遍历的是key_dict,导致内层循环实际未执行
  2. 循环终止逻辑错误:break仅跳出最内层的关键词循环,外层循环仍会继续,且每次df.append会新增一行,而非对应原数据的每行记录
  3. 未处理大小写:客户名称中的大写关键词(如Sheriff)无法匹配字典中的小写关键词
  4. 三层循环冗余:嵌套层级过多,代码可读性和效率差

优化实现方案

利用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 13:50:26