如何用Pandas高效过滤DataFrame中含特定字符串的行?
- 虚拟主机
- 2025-12-25
- 4
在数据处理和分析中,Pandas库是Python生态系统中不可或缺的工具,它提供了高效的数据结构和数据分析功能,过滤DataFrame中包含特定字符串的数据是一项常见需求,无论是文本清洗、数据筛选还是特征提取,这一操作都发挥着重要作用,本文将详细介绍如何使用Pandas实现这一功能,涵盖基础方法、进阶技巧以及实际应用场景,帮助读者全面掌握相关技能。
基础过滤方法:使用str.contains()函数
Pandas的字符串方法(str)为DataFrame的列操作提供了极大的便利,要过滤包含特定字符串的数据,最常用的方法是str.contains()函数,该函数返回一个布尔Series,指示每个元素是否包含指定的子字符串,假设有一个包含产品名称的DataFrame,我们想筛选出名称中包含“手机”的产品,可以这样操作:
import pandas as pd # 示例DataFrame data = {'产品名称': ['智能手机A', '平板电脑B', '手机壳C', '智能手表D', '手机E'], '价格': [2999, 1999, 99, 1299, 3999]} df = pd.DataFrame(data) # 过滤包含“手机”的数据 filtered_df = df[df['产品名称'].str.contains('手机')]
需要注意的是,str.contains()默认区分大小写,如果希望忽略大小写,可以设置参数case=False,该函数还支持正则表达式,例如str.contains('手机|电脑')可以同时匹配包含“手机”或“电脑”的行。

进阶过滤技巧:处理缺失值与复杂条件
在实际数据中,可能会遇到缺失值(NaN)或需要组合多个过滤条件的情况。str.contains()在遇到缺失值时会返回False,如果希望将缺失值视为包含特定字符串,可以结合fillna()方法处理:
# 假设列中存在缺失值 df['产品名称'] = df['产品名称'].fillna('') filtered_df = df[df['产品名称'].str.contains('手机', na=False)]
对于多条件过滤,可以使用逻辑运算符(&、)结合括号实现,筛选名称包含“手机”且价格大于2000的产品:
filtered_df = df[df['产品名称'].str.contains('手机') & (df['价格'] > 2000)]
性能优化:使用regex参数与向量化操作
当数据量较大时,过滤操作的性能可能成为瓶颈。str.contains()的regex参数允许启用正则表达式,但默认情况下已启用,如果不需要正则表达式功能,可以设置regex=False以提高速度,避免在循环中逐行过滤,而是尽量使用向量化操作,

实际应用场景:文本数据清洗与分类
在实际项目中,过滤特定字符串常用于文本数据清洗,分析用户评论时,可能需要筛选出包含“反馈”或“问题”的负面评论:
comments = pd.DataFrame({'评论内容': ['产品质量很好', '物流太慢了,反馈!', '性价比不错', '有瑕疵,希望改进']}) negative_comments = comments[comments['评论内容'].str.contains('反馈|问题|瑕疵')]
在数据分类中,可以通过关键词过滤实现标签自动分配,根据产品名称中的关键词分类:
conditions = [ df['产品名称'].str.contains('手机|平板'), df['产品名称'].str.contains('手表|手环'), df['产品名称'].str.contains('配件|壳') ] choices = ['电子产品', '可穿戴设备', '配件'] df['类别'] = np.select(conditions, choices, default='其他')
常见问题与解决方案
在实际操作中,可能会遇到一些常见问题,如何过滤不包含特定字符串的数据?可以通过在str.contains()前加实现:

# 过滤不包含“手机”的数据 filtered_df = df[~df['产品名称'].str.contains('手机')]
另一个问题是如何过滤包含多个关键词中任意一个的数据?如前所述,使用连接关键词即可:
filtered_df = df[df['产品名称'].str.contains('手机|电脑|平板')]
相关问答FAQs
Q1: 如何过滤DataFrame中某一列包含特定字符串且另一列满足数值条件的行?
A1: 可以结合布尔索引和逻辑运算符实现,筛选名称包含“手机”且价格大于3000的行:
filtered_df = df[df['产品名称'].str.contains('手机') & (df['价格'] > 3000)]
注意括号的使用,确保逻辑运算符的优先级正确。
Q2: 如果数据中存在大量重复的特定字符串,如何高效去重并过滤?
A2: 可以先使用drop_duplicates()去重,再进行过滤。
unique_df = df.drop_duplicates(subset=['产品名称']) filtered_df = unique_df[unique_df['产品名称'].str.contains('手机')]
如果去重和过滤的列不同,可以调整subset参数或分别操作。