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

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)

运行后输出不符合预期:

ProductExact_match
Lysol DisinfectantLys
Napkins LysLys
Cream ClarinsCream Clarins

期望输出为:

ProductExact_match
Lysol DisinfectantLysol
Napkins LysLys
Cream ClarinsClarins

原代码问题点

  • 循环逻辑错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:15:38