如何在Pandas中筛选包含列表中一个或多个关键词的行?
解决Pandas筛选包含任意关键词的行的问题
嘿,我懂你碰到的问题啦——你直接把关键词列表传给str.contains()肯定不行,因为这个方法默认只接受单个字符串或者正则表达式,不认列表参数的。下面给你几个实用的解决办法,挑适合你的场景来用:
方法1:用正则表达式拼接关键词(推荐,效率高)
str.contains()支持正则匹配,我们可以把关键词用|(表示“或”)拼接成一个正则模式,这样就能匹配包含任意一个关键词的行:
import pandas as pd keywords = ['k_1', 'k_2', 'k_3', 'k_4'] # 拼接关键词为正则模式 keyword_pattern = '|'.join(keywords) # 筛选行,na=False处理空值,case=False可选(忽略大小写) filtered_df = df[df['Title'].str.contains(keyword_pattern, case=False, na=False)]
- 小提示:
na=False是为了避免Title列中的空值导致筛选出错;如果需要区分大小写,去掉case=False就行。
方法2:用apply()结合any()(直观易懂)
如果你觉得正则有点绕,可以用apply()遍历每一行,检查是否有任意一个关键词存在:
filtered_df = df[df['Title'].apply(lambda x: any(key in str(x) for key in keywords))]
- 这里用
str(x)是为了兼容Title列中可能存在的非字符串类型(比如数字、空值),避免报错;any()函数只要找到一个匹配的关键词就会返回True。
方法3:处理含特殊正则字符的关键词
如果你的关键词里有.、*、?这类正则特殊字符,直接拼接会导致匹配出错,这时候要先转义每个关键词:
import pandas as pd import re keywords = ['k_1', 'k_2', 'k_3', 'k_4'] # 转义每个关键词的特殊正则字符 escaped_keywords = [re.escape(key) for key in keywords] keyword_pattern = '|'.join(escaped_keywords) filtered_df = df[df['Title'].str.contains(keyword_pattern, case=False, na=False)]
比如关键词是k.1的话,转义后会变成k\.1,这样就只会匹配字面意义的k.1,而不是k任意字符1。
内容的提问来源于stack exchange,提问作者Matin Amani
相关产品推荐
相关产品推荐

