如何在Pandas中基于列内部分字符串过滤数据行?
高效过滤DataFrame中包含指定关键词的行
你的问题出在匹配逻辑上:
- 第一种方法是判断
displayed_link的完整字符串是否在排除列表里,但实际displayed_link是完整URL,自然全返回F - 第二种方法语法错误,因为不能直接判断列表是否在字符串里,要逐个检查列表元素是否在字符串中
针对你的需求,最高效的方法是利用pandas的向量化字符串操作(比逐行循环快得多),结合正则表达式批量匹配:
步骤1:构造正则匹配模式
先把排除列表转成正则能用的模式,用|分隔每个关键词,同时转义特殊字符避免正则语法干扰:
import re import pandas as pd # 你的排除列表 promotions = ["coursera", "rasmussen", "snhu", "mastersindatascience", "northeastern", "mygreatlearning", "payscale.com", "careerfoundry", "microsoft.com", "codecademy", "edx.org", "ahima.org", "›certification-exams›chda'"] # 构造正则模式,转义每个关键词 pattern = '|'.join(re.escape(kw) for kw in promotions)
步骤2:过滤数据
用str.contains匹配关键词,再取反得到有效数据(保留不包含任何排除关键词的行):
# 筛选出不含排除关键词的行,case=False表示不区分大小写 filtered_df = df[~df['displayed_link'].str.contains(pattern, case=False, na=False)]
~表示取反,保留不符合匹配条件的行case=False避免因为大小写差异漏匹配(比如Coursera和coursera)na=False处理列中的空值,避免报错
备选方法(效率较低,适合小数据量)
如果不想用正则,可以用apply结合any()逐个检查,但数据量大时性能不如向量化操作:
def has_excluded_keyword(link): return any(kw in link for kw in promotions) filtered_df = df[~df['displayed_link'].apply(has_excluded_keyword)]
内容的提问来源于stack exchange,提问作者elksie5000
相关产品推荐
相关产品推荐

