在数据处理与分析中,Pandas 是 Python 中最核心的库之一,其 DataFrame 结构提供了高效的数据操作能力,过滤包含特定字符串的数据是常见需求,无论是清洗文本数据、提取关键信息还是筛选特定条件的记录,掌握多种过滤方法都能显著提升工作效率,以下将详细介绍几种常用方法,涵盖基础到进阶的应用场景,并辅以示例说明其操作逻辑与适用场景。

使用 str.contains() 方法进行模糊匹配
str.contains() 是 Pandas 中专门用于检测字符串是否包含特定子串的方法,返回布尔 Series,可直接用于索引过滤,该方法支持正则表达式,灵活性高,适合需要模糊匹配的场景,假设有一个包含产品名称的 DataFrame df,需筛选名称中包含“手机”的记录,可使用:
filtered_df = df[df['产品名称'].str.contains('手机', na=False)]
na=False 参数用于处理缺失值,避免因 NaN 导致报错,若需匹配多个关键词(如“手机”或“平板”),可通过正则表达式实现:
filtered_df = df[df['产品名称'].str.contains('手机|平板', na=False)]
该方法对大小写敏感,若需忽略大小写,可添加 case=False 参数:
filtered_df = df[df['产品名称'].str.contains('手机', case=False, na=False)]
使用 str.match() 方法进行正则表达式匹配
str.match() 与 str.contains() 类似,但仅匹配字符串开头符合正则表达式的模式,筛选以“华为”开头的产品名称:
filtered_df = df[df['产品名称'].str.match('^华为', na=False)]
该方法适用于需要严格限定字符串起始位置的场景,如校验特定前缀的编号或名称。

使用 isin() 方法精确匹配关键词列表
若需过滤包含多个特定关键词之一的数据(且关键词可能出现在字符串任意位置),可结合 str.split() 与 isin() 实现,筛选“产品名称”列中包含“手机”“电脑”“平板”之一的记录:
keywords = ['手机', '电脑', '平板'] filtered_df = df[df['产品名称'].str.split().apply(lambda x: any(kw in x for kw in keywords))]
此方法先将字符串拆分为单词列表,再检查是否存在关键词,适合关键词为独立单词的情况,若需直接匹配子串(而非独立单词),可改用:
filtered_df = df[df['产品名称'].apply(lambda x: any(kw in x for kw in keywords))]
使用 query() 方法简化条件表达式
query() 方法允许通过类 SQL 语法编写过滤条件,代码更简洁,筛选“产品名称”包含“手机”且“销量”大于 100 的记录:
filtered_df = df.query("产品名称.str.contains('手机') and 销量 > 100", engine='python')
需注意 engine='python' 参数以支持字符串方法调用,该方法适合复杂条件的组合查询。
处理多列过滤与缺失值
若需同时检查多列是否包含特定字符串,可使用 DataFrame.any() 方法,筛选“产品名称”或“描述”列包含“促销”的记录:

filtered_df = df[df[['产品名称', '描述']].apply(lambda x: x.str.contains('促销', na=False)).any(axis=1)]
any(axis=1) 表示只要任意一列满足条件即保留,对于缺失值,除 na=False 外,还可提前用 fillna() 填充默认值,如:
df['产品名称'] = df['产品名称'].fillna('未知')
filtered_df = df[df['产品名称'].str.contains('手机', na=False)]
方法对比与选择建议
为更直观地选择合适方法,以下是常见场景的对比:
| 方法 | 适用场景 | 是否支持正则 | 是否支持多列 | 示例 |
|---|---|---|---|---|
str.contains() |
模糊匹配子串(任意位置) | 是 | 否(需结合any) |
df[df['列'].str.contains('关键词')] |
str.match() |
匹配字符串开头 | 是 | 否 | df[df['列'].str.match('^前缀')] |
isin()+apply |
匹配多个关键词之一 | 否 | 是 | df[df['列'].apply(lambda x: any(kw in x for kw in keywords))] |
query() |
复杂条件组合 | 是 | 是 | df.query("列.str.contains('关键词') and 其他列 > 值") |
相关问答FAQs
Q1:如何过滤不包含特定字符串的数据?
A:可通过在 str.contains() 前添加 取反实现,筛选“产品名称”不包含“手机”的记录:
filtered_df = df[~df['产品名称'].str.contains('手机', na=False)]
Q2:如何高效过滤大数据集中包含特定字符串的数据?
A:对于大数据集,建议优先使用 str.contains() 的 na=False 参数,并避免在循环中逐行操作,可通过 dtype 优化(如将字符串列转为 category 类型)提升性能,示例:
df['产品名称'] = df['产品名称'].astype('category')
filtered_df = df[df['产品名称'].str.contains('手机', na=False)]
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/310541.html