在 pandas 中,df.query() 方法允许开发者通过传入字符串形式的条件表达式快速筛选 DataFrame 数据,这种方式书写简洁,适合快速调试和简单筛选场景。很多习惯使用 pandas 的开发者切换到 Polars 后,会寻找对应的功能实现方式,实际上 Polars 并没有直接提供同名的 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 方法,不过这种方式会损失部分性能,仅建议在迁移旧代码时临时使用。