
Polars 没有 query() 方法,其等效功能由 filter() 配合表达式(如 pl.col())实现,语法更明确、类型安全且性能更优。
polars 没有 `query()` 方法,其等效功能由 `filter()` 配合表达式(如 `pl.col()`)实现,语法更明确、类型安全且性能更优。
在 pandas 中,df.query("B >= @item") 提供了一种字符串形式的、类似 SQL 的动态过滤语法,支持变量插值(@item)和简洁的列引用。而 Polars 采用声明式表达式 API,不提供字符串解析式的查询接口——这是有意为之的设计选择:它避免了运行时解析开销、提升类型推断能力,并确保编译期可验证性。
✅ 正确等效写法如下:
import polars as pl
import numpy as np
data = {
'A': ["Polars", "Python", "Pandas"],
'B': [23000, 24000, 26000],
'C': ['30days', '40days', None], # 注意:Polars 中推荐用 None 代替 np.nan
}
df = pl.DataFrame(data)
item = 24000
# ✅ 推荐:使用表达式 + filter()
result = df.filter(pl.col("B") >= item)
print(result)输出:
shape: (2, 3) ┌────────┬───────┬────────┐ │ A ┆ B ┆ C │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ str │ ╞════════╪═══════╪════════╡ │ Python ┆ 24000 ┆ 40days │ │ Pandas ┆ 26000 ┆ null │ └────────┴───────┴────────┘
? 关键要点说明:
主要更新介绍: 完美整合Discuz!论坛,实现一站式登陆、退出、注册; 同步所有会员资料; 新增购物车功能,商品购买更加方便、快捷; 新增部分快捷菜单,网站访问更加方便; 限制首页商品、店铺标题显示长度; 修正会员后台管理不能更改密码的错误; 完善商品显示页面所有功能链接; 修正后台标签管理部分错误; 修正前台学校列表不按后台顺序显示的错误; 修正搜索功能中学校名称过长导致显示紊乱的现象; 修正
- pl.col("B") 是 Polars 表达式的核心构建块,代表对列 "B" 的引用;所有逻辑运算(>=, ==, is_null(), str.contains() 等)均基于表达式链式调用。
- 变量 item 直接参与比较,无需 @ 前缀——因为表达式在 Python 层构造,天然支持本地变量作用域。
- filter() 语义清晰:仅保留满足条件的行,与 pandas 的 query() 行为一致(注意:不同于 pandas 的 loc[...],后者还支持列选择;若需同时筛选行列,请组合 filter() 与 select() 或切片)。
? 进阶示例(多条件 & 字符串操作):
# 等价于 pandas: df.query("B >= @item and C.str.contains('days')")
df.filter(
(pl.col("B") >= item) &
pl.col("C").str.contains("days")
)⚠️ 注意事项:
- ❌ 不要尝试 df.filter("B >= @item") —— filter() 不接受字符串表达式,会报 TypeError;Polars 拒绝隐式字符串解析,强制显式表达式以保障健壮性。
- ✅ 对空值(null)处理更严谨:pl.col("C").is_null() 明确区分缺失值,而 pandas 的 query() 在含 NaN 时可能因 NaN == NaN 为 False 导致意外行为。
- ? 性能优势:表达式在 Polars 查询引擎中被提前编译优化,尤其在大表过滤场景下显著快于 pandas 的 query()(后者需经 numexpr 解析)。
总结:放弃 query() 的字符串惯性,拥抱 filter() + pl.col() 的表达式范式——这是写出高效、可维护、类型安全 Polars 代码的第一步。









