You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 04:32:44