query方法中多条件表达式须用&、|、~连接且每条件加括号;字符串值需引号包裹,含空格列名用反引号;不支持and/or/not,变量引用须加@前缀。

query方法里怎么写多个条件表达式
直接用布尔运算符 &、|、~ 连接子条件,注意必须用括号把每个子条件包起来。Pandas的 query 不支持 Python 原生的 and/or/not,用了会报 UndefinedVariableError 或语法错误。
常见写法示例:
df.query('(age > 25) & (city == "Beijing") & (salary >= 15000)')
容易踩的坑:
- 字符串值必须用双引号或单引号包裹,比如
"Beijing",不能写成Beijing - 列名含空格或特殊字符时,得用反引号:
`user id` == 123 -
&的优先级高于==,不加括号会导致逻辑错乱,例如age > 25 & city == "Beijing"实际等价于age > (25 & city) == "Beijing",直接报错
query和loc[...]在性能与可读性上怎么选
query 在数据量大(>10万行)且条件复杂时通常更快,因为它底层做了表达式解析优化,并支持延迟计算;而 loc 是纯 Python 索引操作,小数据下差异不明显,但链式写法更直观。
适用场景建议:
- 条件动态拼接(比如从 Web 表单接收多个筛选参数)——优先用
query,字符串拼接比嵌套loc更简洁 - 需要复用中间布尔索引(如先筛再统计再绘图)——用
loc,避免重复解析表达式 - 涉及
isin、str.contains等方法调用——query支持但语法稍重,例如query('name.str.contains("Li")'),不如df.loc[df["name"].str.contains("Li")]直观
query中引用外部变量的正确写法
用 @ 符号前缀访问局部/全局变量,这是 query 的关键能力,否则变量名会被当成列名处理。
示例:
min_age = 25<br>max_salary = 20000<br>df.query('age >= @min_age and salary
<p>注意事项:</p>
- 只能引用变量,不能调用函数(比如
@len(x)不合法) - 如果变量是列表,可以直接用
in:df.query('department in @dept_list') - 变量名不能和列名冲突,否则
@会被忽略,导致意外行为
query不支持的操作和替代方案
query 无法处理某些 Pandas 特有操作,比如跨列计算(df['a']/df['b'] > 2)、时间属性访问(date.dt.year == 2023)、或自定义函数映射。遇到这些情况会抛出 ParserError 或 UndefinedVariableError。
可行的绕过方式:
- 提前计算好新列:
df = df.assign(ratio=df.a / df.b),再用query('ratio > 2') - 对时间列先提取属性:
df = df.assign(year=df.date.dt.year),再进query - 混合使用:先用
query做主干筛选,再用loc处理剩余逻辑,避免全量走loc
最常被忽略的是:query 的字符串是在当前作用域中执行的,如果在函数内调用且变量位于闭包中(而非局部或全局),@ 可能找不到——这时候老实用 loc 更稳。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











