Python Pandas实现句子列不区分大小写匹配行内关键词
基于Pandas的逐行关键词不区分大小写匹配实现
需求说明
逐行校验Sentence列的句子文本,不区分大小写判断是否包含对应行Keyword列中的任意关键词,最终在DataFrame中新增Match列存储布尔类型的匹配结果。
问题根因
从CSV导入数据时,原列表类型的Keyword列会被自动转换为带多余空格、包裹符号的字符串。此时直接调用str.join('|')拼接正则规则时,字符串会被作为字符级可迭代对象处理,最终在每个单字符之间插入|,完全无法得到预期的关键词拼接规则。
测试基准代码
import pandas as pd Sentence = ["Clear is very good","Fill- low light, compact","stripping topsoil"] Keyword =[['Clearing', 'grubbing','clear','grub'],['Borrow,', 'Fill', 'and', 'Compaction'],['Fall']] df = pd.DataFrame({'Sentence': Sentence, 'Keyword': Keyword})
预期输出的Match列取值为:[True, True, False]
完整实现方案
场景1:Keyword列本身为列表类型(如手动构造DataFrame场景)
直接逐行做小写转换后的子串判断即可,无需额外格式处理:
df['Match'] = df.apply( lambda row: any(single_kw.lower() in row['Sentence'].lower() for single_kw in row['Keyword']), axis=1 )
场景2:CSV导入后Keyword列为字符串类型
先完成字符串到关键词列表的还原清洗,再执行匹配逻辑:
def parse_keyword_string(kw_content): # 去除列表包裹符、首尾多余空格 clean_content = kw_content.strip("[] ") # 按逗号拆分关键词,逐个去除多余的引号、空格 kw_list = [item.strip(" '\"") for item in clean_content.split(",")] # 过滤拆分产生的空值 return [kw for kw in kw_list if kw] # 先把字符串格式的Keyword还原为列表 df['Keyword'] = df['Keyword'].apply(parse_keyword_string) # 执行逐行匹配 df['Match'] = df.apply( lambda row: any(single_kw.lower() in row['Sentence'].lower() for single_kw in row['Keyword']), axis=1 )
结果验证
执行代码后输出的DataFrame如下,完全符合预期:
| Sentence | Keyword | Match |
|---|---|---|
| Clear is very good | ['Clearing', 'grubbing', 'clear', 'grub'] | True |
| Fill- low light, compact | ['Borrow,', 'Fill', 'and', 'Compaction'] | True |
| stripping topsoil | ['Fall'] | False |
扩展提示:如果需要避免短关键词误匹配长单词的部分子串,可以把匹配逻辑替换为带词边界
\b的正则规则,实现整词匹配。
内容的提问来源于stack exchange,提问作者Joe Ng
相关产品推荐
相关产品推荐

