pandas基于多列指定关键词匹配结果填充新列及冲突处理方案
原代码问题分析
- 循环逻辑错误:第一个关键词
Deck匹配失败后直接触发else返回unset,根本没有执行后续关键词的匹配逻辑 - 列检查顺序错误:需求要求优先检查
ColC→ColB→ColA,原函数是ColA→ColB→ColC,顺序完全相反 - 未处理冲突场景:没有校验同一行是否匹配到多个不同关键词
- 关键词顺序错误:需求要求关键词优先级是
['Deck', 'Beam', 'Wall', 'Grating'],原函数列表顺序不符合要求 - 空值兼容问题:如果单元格是空值直接调用
.lower()会触发报错
正确实现方案
def calc_ColD(row, keywords: list): matched = set() # 按优先级遍历所有关键词 for kw in keywords: kw_lower = kw.lower() # 单关键词检查顺序:ColC → ColB → ColA for col in ['ColC', 'ColB', 'ColA']: cell_val = str(row[col]).strip().lower() if kw_lower in cell_val: matched.add(kw) break # 匹配到后跳过当前关键词剩余列的检查 # 按规则返回结果 if len(matched) > 1: return 'Conflict' elif len(matched) == 1: return next(iter(matched)) else: return '' # 无匹配返回空值 # 自定义关键词列表,后续新增关键词直接修改该列表即可 KEYWORDS = ['Deck', 'Beam', 'Wall', 'Grating'] df['ColD'] = df.apply(calc_ColD, axis=1, keywords=KEYWORDS)
方案说明
- 扩展性强:关键词通过入参传入,后续新增匹配规则不用修改函数逻辑,直接调整
KEYWORDS列表即可 - 优先级完全符合要求:先按关键词顺序校验,每个关键词严格按照
ColC→ColB→ColA的顺序检查 - 兼容异常场景:空单元格会先转字符串处理,不会触发方法调用报错
- 冲突校验准确:用集合存储匹配到的关键词,自动去重,只要匹配到多个不同关键词就返回
Conflict - 输出完全符合需求:无匹配返回空字符串,和预期输出规则一致
内容的提问来源于stack exchange,提问作者user14380579
相关产品推荐
相关产品推荐

