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

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."
  • 预期输出:返回索引为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 22:42:33