pandas如何实现df列与列表字符串的精确匹配提取
Pandas 字段关键词匹配问题修复
问题复现
需求为提取DataFrame的Product列中与指定列表精确匹配的字符串,初始实现代码如下:
my_list = ['Lys', 'Lysol', 'Cla', 'Clarins'] def test(row): for i in my_list: if i in row['Product']: return i else: return row['Product'] df['Exact_match'] = df.apply(test, axis=1)
运行后输出不符合预期:
| Product | Exact_match |
|---|---|
| Lysol Disinfectant | Lys |
| Napkins Lys | Lys |
| Cream Clarins | Cream Clarins |
期望输出为:
| Product | Exact_match |
|---|---|
| Lysol Disinfectant | Lysol |
| Napkins Lys | Lys |
| Cream Clarins | Clarins |
原代码问题点
- 循环逻辑错误:
return语句写在单次循环的else分支中,遍历第一个关键词如果未命中就直接返回原Product值,不会继续遍历列表后续项,直接导致排在列表后面的Clarins等关键词无法被匹配 - 匹配优先级错误:未对关键词按长度排序,短词优先遍历,导致
Lys作为Lysol的子串被优先命中,出现短词覆盖长词的误匹配
修复方案
方案1:适配当前场景的子串匹配
先将关键词列表按字符串长度从长到短排序,保证长词优先匹配;移除循环内的else分支,遍历完所有关键词都未命中时再返回原字段值:
# 关键词按长度降序排序,长词优先匹配 sorted_keywords = sorted(my_list, key=len, reverse=True) def get_exact_match(row): product = row['Product'] for kw in sorted_keywords: if kw in product: return kw # 所有关键词均未命中时返回原值 return product df['Exact_match'] = df.apply(get_exact_match, axis=1)
方案2:严格独立词匹配(避免子串误判)
如果需要避免非独立词的子串误判(比如产品名包含Lysabc时不应该匹配到Lys),可以结合正则词边界做严格的独立词校验:
import re sorted_keywords = sorted(my_list, key=len, reverse=True) def get_exact_word_match(row): product = row['Product'] for kw in sorted_keywords: # 匹配前后为词边界的独立关键词,re.escape处理关键词中可能存在的特殊正则字符 if re.search(rf'\b{re.escape(kw)}\b', product): return kw return product df['Exact_match'] = df.apply(get_exact_word_match, axis=1)
运行上述代码即可得到符合预期的匹配结果。
内容的提问来源于stack exchange,提问作者Loki
相关产品推荐
相关产品推荐

