query()比布尔索引更易读,因其支持类似sql的字符串表达式(如"age > 30 and city == 'beijing'"),避免布尔索引中繁琐的df['col']重复书写、括号嵌套及&运算符优先级陷阱;变量通过@前缀安全传入,列名含特殊字符时用反引号包裹。

query() 为什么比布尔索引更易读?
因为 query() 支持字符串形式的表达式,能直接写成类似 SQL 的自然语言逻辑,比如 "age > 30 and city == 'Beijing'",而不用拼接 df[df['age'] > 30 & df['city'] == 'Beijing'] 这种括号和运算符容易出错的链式布尔索引。
注意:& 在布尔索引中是位与操作符,必须用括号包裹每个条件;query() 内部自动解析优先级,省去括号烦恼。
变量怎么安全地传入 query 字符串?
别用 f-string 拼接变量——有注入风险,且字符串里单双引号容易打架。正确做法是用 @ 前缀引用局部变量或 DataFrame 属性:
-
min_age = 25→df.query("age > @min_age") -
threshold = 100→df.query("value >= @threshold") - 想引用列名含空格或特殊字符?用反引号:
df.query("`user name`.str.startswith('A')")
如果变量名和列名冲突(比如你有个变量叫 city,DataFrame 也有 city 列),@city 一定指向变量,列名直接写 city 即可。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
哪些语法在 query() 中不支持?
query() 不是 Python 全功能解释器,它只支持有限的表达式语法:
- 不支持函数调用带括号的复杂方法,如
str.contains()要写成col.str.contains('x'),但不能写col.str.contains('x', case=False)(参数不被识别) - 不支持
is None,得写成col.isnull()或col.isna() - 不支持海象运算符
:=、lambda、列表推导式 - 所有字符串比较必须用
==,不能用is
遇到不支持的操作,就退回到布尔索引,别硬套 query()。
性能差异大吗?什么时候该换回布尔索引?
小数据(query() 实际调用的是 numexpr 引擎,默认更快,尤其多条件组合时。但有两个坑:
- 如果表达式里用了未向量化的方法(比如
col.apply(lambda x: ...)),query()会退化成慢路径,甚至比布尔索引还慢 - 使用
in判断时,col in [1, 2, 3]是支持的,但col in my_list要求my_list是 Python list/tuple,不能是 set 或 numpy array(否则报TypeError: unexpected type)
真正影响可读性的不是语法糖,而是你是否清楚哪些操作能“翻译”成高效表达式——写完 query() 最好用 %%timeit 对比下实际耗时。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










