Polars 中如何实现 pandas df.query() 的功能

来源:建站技术作者:又改需求头衔:程序员
导读:本期聚焦于小伙伴创作的《Polars 中如何实现 pandas df.query() 的功能》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Polars 中如何实现 pandas df.query() 的功能》有用,将其分享出去将是对创作者最好的鼓励。

在 pandas 中,df.query() 方法允许开发者通过传入字符串形式的条件表达式快速筛选 DataFrame 数据,这种方式书写简洁,适合快速调试和简单筛选场景。很多习惯使用 pandas 的开发者切换到 Polars 后,会寻找对应的功能实现方式,实际上 Polars 并没有直接提供同名的 query 方法,但是可以通过自身的表达式系统实现完全等效甚至更强大的筛选能力。

Polars 中如何实现 pandas df.query() 的功能

Polars 与 pandas 筛选逻辑的核心差异

pandas 的 df.query() 是基于字符串解析执行筛选,而 Polars 的设计理念是通过强类型的表达式体系完成所有数据操作,这种方式在类型安全、执行效率和复杂逻辑支持上更有优势。Polars 中筛选数据的核心方法是 filter,配合 Polars 的表达式语法,就可以实现 pandas df.query() 的所有功能。

基础筛选场景实现

首先我们看一个 pandas 中使用 df.query() 的基础示例,然后给出对应的 Polars 实现。

pandas 实现示例

import pandas as pd

# 构造测试数据
df_pd = pd.DataFrame({
    "name": ["张三", "李四", "王五", "赵六"],
    "age": [22, 35, 28, 40],
    "score": [85, 92, 78, 88]
})

# 使用 query 筛选年龄大于25且分数大于80的数据
result_pd = df_pd.query("age > 25 and score > 80")
print(result_pd)

对应的 Polars 实现

import polars as pl

# 构造相同的测试数据
df_pl = pl.DataFrame({
    "name": ["张三", "李四", "王五", "赵六"],
    "age": [22, 35, 28, 40],
    "score": [85, 92, 78, 88]
})

# 使用 filter 配合表达式实现筛选
result_pl = df_pl.filter((pl.col("age") > 25) & (pl.col("score") > 80))
print(result_pl)

可以看到两者输出的结果完全一致,Polars 中通过 pl.col() 获取列对象,再配合比较运算符和逻辑运算符 &(与)、|(或)、~(非)组合条件,就可以完成和 pandas query 相同的筛选逻辑。

复杂表达式筛选实现

pandas 的 df.query() 还支持字符串方法调用、in 判断等复杂表达式,这些在 Polars 中也都有对应的实现方式。

字符串匹配筛选

pandas 中使用 query 筛选姓名包含"张"的数据:

result_pd = df_pd.query("name.str.contains('张')")

对应的 Polars 实现:

result_pl = df_pl.filter(pl.col("name").str.contains("张"))

成员判断筛选

pandas 中使用 query 筛选年龄在某个列表中的数据:

result_pd = df_pd.query("age in [22, 28, 35]")

对应的 Polars 实现:

result_pl = df_pl.filter(pl.col("age").is_in([22, 28, 35]))

动态条件构建方式

pandas 的 df.query() 支持传入变量,Polars 的表达式体系同样支持动态构建条件,甚至更加灵活。比如我们需要根据外部传入的阈值动态筛选数据:

# 动态阈值
min_age = 25
min_score = 80

# pandas 动态条件
result_pd = df_pd.query(f"age > {min_age} and score > {min_score}")

# Polars 动态条件,直接拼接表达式即可
result_pl = df_pl.filter((pl.col("age") > min_age) & (pl.col("score") > min_score))

如果条件更加复杂,需要动态组合多个判断逻辑,Polars 还支持将多个条件表达式保存到列表中,再使用 pl.all_horizontal 组合多个与条件,或者 pl.any_horizontal 组合多个或条件:

# 动态条件列表
conditions = [
    pl.col("age") > 25,
    pl.col("score") > 80,
    pl.col("name").str.contains("李")
]

# 组合多个与条件
result_pl = df_pl.filter(pl.all_horizontal(conditions))
print(result_pl)

性能与最佳实践建议

相比 pandas 的 df.query(),Polars 的 filter 表达式筛选在大数据量下性能优势明显,因为 Polars 的表达式会在执行前进行优化,并且支持多线程并行计算。在实际使用中,建议优先使用 Polars 原生的表达式语法,而不是尝试通过字符串解析的方式模拟 pandas 的 query 行为,这样既能保证类型安全,也能获得更好的执行效率。

如果确实需要兼容原有的 query 字符串表达式逻辑,也可以基于 Polars 的表达式系统封装一个简单的 query 方法,不过这种方式会损失部分性能,仅建议在迁移旧代码时临时使用。

Polarspandasdf_query数据筛选DataFrame修改时间:2026-07-21 14:00:26

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