query方法中多条件布尔表达式需用&、|、~且每条件加括号;含空格或特殊字符列名须用反引号包裹;小数据量时query通常比布尔索引慢,且不支持链式操作。

query方法里怎么写多条件布尔表达式
直接用字符串写,用 &(不是 and)、|(不是 or)、~(不是 not),所有条件必须用括号包裹,否则运算优先级会出错。
常见错误现象:df.query("age > 25 and salary 报 <code>UndefinedVariableError —— 因为 and 是 Python 关键字,query 只认位运算符。
df.query("(age > 25) & (salary- 字符串值必须用单引号或双引号包裹,且内外引号不能相同:
df.query("name == 'Alice'")✅,df.query("name == "Alice"")❌ - 变量插值用
@前缀:min_age = 25; df.query("age > @min_age")
处理含空格或特殊字符的列名
列名带空格、连字符、点号等时,query 默认解析失败,必须用反引号 ` 包裹列名。
使用场景:读取 Excel 或 CSV 后列名是 "user id"、"total-price"、"2023_score" 这类。
df.query("`user id` > 100 & `total-price` > 50")-
df.query("`2023_score` >= 90")—— 数字开头的列名也必须加反引号 - 不加反引号会报
SyntaxError: invalid syntax或KeyError
query比布尔索引快还是慢?什么情况下别用
小数据量(query 通常略快,因为它底层用了 numexpr 加速计算,但前提是表达式能被 numexpr 编译。
容易踩的坑:一旦表达式里出现 Python 函数(如 str.contains、isin 调用列表)、lambda、或未注册的自定义方法,query 就自动退回到 Python 解释器执行,反而更慢,甚至报错。
- 支持:
df.query("name.str.startswith('A')")✅(pandas 扩展语法) - 不支持:
df.query("name in ['Alice', 'Bob']")❌ → 改用df.query("name in @my_list"),其中my_list = ['Alice', 'Bob'] - 绝对避免:
df.query("np.log(age) > 3")→np未注入命名空间,会报NameError
如何调试query字符串报错
最有效的办法是先构造好字符串,打印出来看是否合法,再传给 query。很多错误其实是引号嵌套或括号漏写导致的语法问题。
性能 / 兼容性影响:在 pandas 1.5+ 中 query 对 nullable 类型(如 Int64、string)支持良好;但旧版本对 category 列做比较时可能隐式转 str,结果意外。
expr = "(age > 25) & (city in @cities)"; print(repr(expr)); df.query(expr)- 遇到
InvalidSyntaxError,复制打印出的字符串到 Python 解释器中手动eval一下,能快速定位括号或引号问题 - 用
engine='python'强制走 Python 模式(df.query(..., engine='python'))可绕过 numexpr 限制,但失去加速优势
@、还有习惯性写 and —— 这三点占了 80% 的报错。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











