Pandas isin()筛选含指定关键词的DataFrame行无返回问题
Pandas按独立精确关键词筛选DataFrame文本行
需求说明
在DataFrame对象df1的text列中检索指定关键词列表,筛选出关键词作为独立完整单词存在的行,禁止匹配长单词中包含的关键词子串。
基础信息
- 待匹配关键词列表:
keywords = ['fake', 'false', 'lie']
- 示例数据集(仅含
text列):- 索引19152:
"I think she is the Corona Virus...." - 索引19154:
"Boy you hate to see that. I mean seeing how it was contained and all." - 索引19155:
"Tell her it’s just the fake flu, it will go away in a few days." - 索引19235:
"Is this fake news?" - 索引20540:
"She’ll believe it’s just alternative facts."
- 索引19152:
- 预期输出:返回索引为19155、19235的两行数据。
已尝试方案的问题根因
- 方案1:直接拼接关键词做
str.contains正则匹配
缺陷:未加单词边界限制,正则会匹配文本任意位置的子串,因此df1[df1['text'].str.contains("|".join(keywords))]believe中嵌套的lie子串会被误判为命中,出现错误匹配。 - 方案2:使用
Series.isin()方法匹配
缺陷:df1[df1.text.isin(keywords)]isin()的逻辑是单元格整值完全相等匹配,只有当某行text的完整内容恰好等于关键词列表中的某一个词时才会命中,而目标数据里的text都是完整长句,自然无法返回任何结果。
正确实现代码
通过正则单词边界符\b包裹所有关键词,确保仅匹配独立存在的完整词,同时自动转义关键词中可能存在的正则特殊字符避免报错:
import re # 构造带单词边界的正则匹配模式 match_pattern = r'\b(?:' + '|'.join(map(re.escape, keywords)) + r')\b' # 执行筛选,na=False代表空值直接判定为不匹配,case=False可按需开启(不区分大小写匹配) filter_result = df1[df1['text'].str.contains(match_pattern, regex=True, na=False)]
匹配效果说明
针对提供的示例数据:
- 索引19155、19235的文本包含独立单词
fake,符合匹配规则被保留 - 索引20540的
lie是believe的内部子串,不满足单词边界要求,不会被误命中 - 其余行无目标独立关键词,被过滤
完全符合预期筛选要求。
常规英文文本场景下
\b单词边界规则可覆盖绝大多数需求,如果文本存在特殊符号、中英文混排等场景,可根据实际情况调整边界匹配规则。
内容的提问来源于stack exchange,提问作者mOna
相关产品推荐
相关产品推荐

