Python中怎样过滤DataFrame数据?

来源:前端技术作者:大海头衔:草根站长
导读:本期聚焦于小伙伴创作的《Python中怎样过滤DataFrame数据?》,敬请观看详情。想从几万行表格里快速捞出符合条件的数据,却总被各种语法搞晕?pandas提供了多种过滤DataFrame的方式,核心在于布尔索引、query方法和loc筛选。布尔索引通过逻辑表达式生成True或False序列来选取行,适合简单条件;query用类SQL字符串写筛选逻辑,可读性高且支持变量引用;loc则能在过滤同时指定要保留的列。实际写代码时,字符串包含判断要用str.contains,多条件之间注意用括号包裹避免运算优先级错误。掌握这几类写法,就能应对大部分数据清洗与抽取场景,不必反复查阅文档。

在Python数据分析工作中,pandas的DataFrame是最常用的二维表格结构。过滤数据指的是从完整表中按行或列的条件挑出子集,这是数据清洗、特征工程和报表生成的前置步骤。不同过滤方式在可读性、性能和适用场景上有明显区别,理解它们的机制能减少出错并提升开发效率。

Python中怎样过滤DataFrame数据?

布尔索引过滤

布尔索引是DataFrame过滤最基础的手段。它的原理是:用一个与行数等长的布尔序列(每个元素是True或False)作为行索引,pandas会保留值为True的那些行。这个布尔序列通常由某一列的比较运算产生,比如df['age'] > 30会返回一串布尔值。

当条件变复杂时,可以用位运算符连接多个布尔表达式。需要特别注意的是,Python里位运算的优先级高于比较运算,所以每个条件必须用括号包起来,再用&(与)、|(或)、~(非)连接。下面示例展示了筛选年龄大于30且城市为北京的用户:

import pandas as pd

data = {
    'name': ['张三', '李四', '王五', '赵六'],
    'age': [25, 34, 45, 29],
    'city': ['北京', '上海', '北京', '广州']
}
df = pd.DataFrame(data)

# 布尔索引多条件过滤
mask = (df['age'] > 30) & (df['city'] == '北京')
result = df[mask]
print(result)

这种写法的优势是直观、灵活,能和NumPy的向量化运算无缝结合,执行速度也很快。缺点是当条件很长时括号嵌套多,可读性下降;另外如果列名包含空格,就必须用df['列名']形式,不能直接用属性访问。

使用query方法

query方法允许把筛选条件写成类似SQL的查询字符串,pandas会在内部解析并生成布尔索引。它对含有空格的列名更友好,直接用反引号包裹即可,也方便把外部变量嵌进去,通过@变量名引用。

相比布尔索引,query在条件复杂、需要动态拼接时更清晰,也避免了括号优先级陷阱。下面代码完成和上面一样的过滤,但表达更紧凑:

# 使用query方法过滤
min_age = 30
city_name = '北京'
result2 = df.query('age > @min_age and city == @city_name')
print(result2)

query的底层仍会转换成布尔索引,因此性能差异很小。不过它不支持某些Python函数调用,字符串方法也要走str.xxx形式。在交互式分析或条件由用户输入拼接的场景里,query是更安全的方案,因为参数化引用降低了注入式错误的风险。

结合loc按行列同时筛选

如果过滤时不仅要选行,还要指定保留哪些列,用loc是最规范的写法。loc接收两个参数:第一个是行选择器(可以是布尔序列、切片或标签列表),第二个是列选择器。这样一行代码就能完成行列双向裁剪。

以下示例在前面年龄和城市条件基础上,只取出姓名和年龄两列:

# loc同时过滤行和列
subset = df.loc[(df['age'] > 30) & (df['city'] == '北京'), ['name', 'age']]
print(subset)

使用loc的好处是语义明确,不会像链式索引(如df[df.x>1]['y'])那样触发pandas的隐式拷贝警告,也能稳定修改原数据。在写数据管道时,推荐统一用loc做带列选择的过滤,代码可维护性更好。

字符串与缺失值处理

真实数据常包含文本列和空值。对字符串过滤要用str.contains,它可以写正则表达式,并用na=False参数把缺失值当作不匹配处理,防止结果里混进NaN行。下面演示筛选姓名中包含“张”的记录:

# 字符串包含过滤,忽略缺失值
name_mask = df['name'].str.contains('张', na=False)
print(df[name_mask])

如果直接对含NaN的列做等于判断,结果里对应行会是False,一般不会报错,但用str访问器时必须显式处理na,否则pandas会抛出错误。过滤完之后,通常接dropnafillna做后续修补,保证下游计算不被空值打断。

过滤方式适用场景主要优点
布尔索引简单或复杂条件行过滤直观、性能好
query类SQL动态条件可读高、支持变量
loc行列同时选取语义清、易修改

综合来看,日常过滤DataFrame并不需要死记所有API,把握“布尔序列选行、loc管行列、query写表达式”三条主线即可。遇到性能瓶颈时,优先检查是否用了向量化过滤而非循环,这往往比换方法更有效。

PythonpandasDataFrame_filter修改时间:2026-08-09 05:51:26

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。