如何用Pandas按包含/排除词列表过滤DataFrame行?
Pandas按关键词/短语筛选并移除指定行的实现方案
优化包含(include)筛选逻辑
别用循环拼接的低效方法,直接用str.contains结合正则表达式,代码更简洁且执行效率更高:
import pandas as pd # 假设原始数据为df,包含目标列Message include = ['word1', 'word2', 'word3'] # 将include列表转为正则匹配模式,匹配任意包含项 include_regex = '|'.join(include) # 筛选包含任意关键词/短语的行,na=False处理空值,case=False忽略大小写(按需调整) filtered_df = df[df['Message'].str.contains(include_regex, case=False, na=False)] # 去重(如果业务需要) filtered_df = filtered_df.drop_duplicates()
正确实现排除(exclude)行的逻辑
之前用~取反失败,大概率是正则匹配逻辑或空值处理的问题,以下是可靠的实现方式:
基础版:排除包含任意exclude项的行
exclude = ['word4', 'word5 word6'] exclude_regex = '|'.join(exclude) # 取反筛选,移除包含任意排除项的行 final_df = filtered_df[~filtered_df['Message'].str.contains(exclude_regex, case=False, na=False)]
精确匹配版:避免部分匹配
如果需要确保完全匹配短语(比如不想误删包含word5 word6xxx的行),给每个短语添加单词边界并转义正则特殊字符:
import re # 对每个短语转义(避免正则特殊字符干扰)并添加单词边界 exclude_regex = '|'.join([rf'\b{re.escape(phrase)}\b' for phrase in exclude]) final_df = filtered_df[~filtered_df['Message'].str.contains(exclude_regex, case=False, na=False)]
常见问题排查
- 空值处理:必须添加
na=False,否则Message列的NaN值会导致筛选结果出现无效行,破坏逻辑 - 大小写敏感:默认
case=True区分大小写,可根据业务需求调整该参数 - 正则特殊字符:如果关键词/短语包含
.、*、?等正则特殊符号,一定要用re.escape()转义,否则会出现匹配错误
内容的提问来源于stack exchange,提问作者Joshua Hey
相关产品推荐
相关产品推荐

