Polars中pandas.DataFrame.query的等价替代方法是什么?
Polars中与pandas.DataFrame.query等价的方法
问题背景
用户需要在Polars中实现类似pandas.DataFrame.query的行筛选功能,测试过程如下:
Pandas 示例
import pandas as pd import numpy as np data= { 'A':["Polars","Python","Pandas"], 'B' :[23000,24000,26000], 'C':['30days', '40days',np.nan], } df = pd.DataFrame(data)
生成的数据:
A B C 0 Polars 23000 30days 1 Python 24000 40days 2 Pandas 26000 NaN
定义变量item后用query筛选:
item=24000 df.query("B>= @item")
筛选结果:
A B C 1 Python 24000 40days 2 Pandas 26000 NaN
Polars 尝试报错
用户在Polars中直接调用query方法:
import polars as pl df = pl.DataFrame(data) item=24000 df.query("B>= @item")
触发错误:
AttributeError: 'DataFrame' object has no attribute 'query'
用户猜测可用df.filter(),但疑惑其语法差异及是否等价于Pandas的df.loc[]。
解决方案
Polars没有内置query方法,pl.DataFrame.filter()是对应的替代方案,以下是具体用法和说明:
1. 实现等价筛选
有两种方式可以实现和Pandas query相同的逻辑:
方式一:Polars表达式语法(推荐)
这种写法类型安全,且Polars会自动做查询优化,性能更优:
import polars as pl import numpy as np data= { 'A':["Polars","Python","Pandas"], 'B' :[23000,24000,26000], 'C':['30days', '40days',np.nan], } df = pl.DataFrame(data) item=24000 filtered_df = df.filter(pl.col("B") >= item) print(filtered_df)
输出结果:
shape: (2, 3) ┌────────┬───────┬────────┐ │ A ┆ B ┆ C │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ str │ ╞════════╪═══════╪════════╡ │ Python ┆ 24000 ┆ 40days │ │ Pandas ┆ 26000 ┆ null │ └────────┴───────┴────────┘
方式二:字符串表达式(贴近Pandas query风格)
如果偏好类SQL的字符串表达式写法,可以用pl.Expr.parse()解析条件:
filtered_df = df.filter(pl.Expr.parse("B >= @item")) print(filtered_df)
该写法同样支持用@引用外部变量,输出结果和上面一致。
2. 语法差异对比
- Pandas
query:直接编写类SQL的字符串表达式,通过@引用外部变量,底层动态解析表达式。 - Polars
filter:- 推荐使用
pl.col()构建表达式,属于强类型API,能提前发现语法错误,且性能更好。 - 支持字符串表达式,但需要用
pl.Expr.parse()包裹,兼容@引用外部变量的写法。
- 推荐使用
3. 与Pandas df.loc[]的等价性
Polars的filter和Pandas的df.loc[条件]完全等价,两者都是基于行的布尔索引实现筛选。例如Pandas中df.loc[df["B"] >= item]和Polars的df.filter(pl.col("B") >= item)逻辑一致。
而Pandas的query本质上是df.loc[]的语法糖,所以Polars的filter既可以替代df.loc[],也能实现df.query的所有筛选功能,只是语法形式不同。
内容的提问来源于stack exchange,提问作者Talha Tayyab
相关产品推荐
相关产品推荐

