Pandas跨DataFrame不区分大小写模糊匹配关键词并新增匹配列
pandas 不区分大小写子串关键词匹配方案
场景说明
现有两个pandas DataFrame对象:
- 待检索数据集
df1:包含1列及以上待检索文本字段,示例数据包含Col A、Desc两列,Desc列存储文本内容,示例值为Dog、dogs、cat、cats、hooman等 - 关键词数据集
df2:存储待匹配关键词列表,示例关键词为dog、cats、bird
需求规则
- 匹配逻辑:支持不区分大小写匹配、子串模糊匹配,例如关键词
dog可命中Dog、dogs等包含该关键词的文本 - 输出要求:结果集保留
df1全部原有列,新增Matched Keyword列存储对应行命中的关键词,无匹配则该列留空 - 示例预期结果:
Col A为00001、00002的行匹配关键词dog,00004行匹配关键词cats,其余行该列为空
稳定实现代码
import pandas as pd import re # -------------------------- # 1. 构造示例测试数据(实际使用时替换为你自己的df1、df2即可) # -------------------------- df1 = pd.DataFrame({ "Col A": ["00001", "00002", "00003", "00004", "00005"], "Desc": ["Dog", "dogs", "cat", "cats", "hooman"] }) df2 = pd.DataFrame({ "keyword": ["dog", "cats", "bird"] # 如果你的df2关键词列名不是keyword,替换为实际列名 }) # -------------------------- # 2. 核心匹配逻辑 # -------------------------- # 提取有效关键词,构建小写到原关键词的映射,保证输出和df2存储的关键词格式一致 keywords = df2['keyword'].dropna().astype(str).tolist() keyword_map = {k.lower(): k for k in keywords} # 对关键词做正则转义,避免关键词含*、.、?等特殊字符时匹配失效 escaped_keywords = [re.escape(k) for k in keyword_map.keys()] match_pattern = re.compile(f'({"|".join(escaped_keywords)})', re.IGNORECASE) if escaped_keywords else None def get_matched_key(text): if not match_pattern or pd.isna(text): return "" match_res = match_pattern.search(str(text)) return keyword_map[match_res.group(1).lower()] if match_res else "" # 生成结果列 df1['Matched Keyword'] = df1['Desc'].apply(get_matched_key)
逻辑说明
- 修复了网上多数方案未处理正则特殊字符的bug,关键词包含任意常规字符都能稳定匹配
- 原生支持不区分大小写匹配,无需提前对原文本做全量大小写转换,保留原数据格式
- 子串匹配逻辑严格符合需求,只要文本任意位置包含关键词即可命中
- 自动处理空值、空关键词列表等边界场景,不会抛出运行异常
- 完全保留
df1原有字段和值,不会修改原始数据
运行上述代码后得到的结果和预期完全一致:
| Col A | Desc | Matched Keyword |
|---|---|---|
| 00001 | Dog | dog |
| 00002 | dogs | dog |
| 00003 | cat | |
| 00004 | cats | cats |
| 00005 | hooman |
如果需要同一行命中多个关键词时全部返回,只需要修改
get_matched_key函数内的逻辑,用findall替换search后用逗号拼接结果即可。
内容的提问来源于stack exchange,提问作者Alex F
相关产品推荐
相关产品推荐

