python中用&、|、~组合布尔条件时括号不能省,因其优先级高于比较运算符;query()更易读但性能略低;空值判断须用isna()/notna();性能敏感场景应优先用布尔索引。

用 &、|、~ 组合布尔条件时括号不能省
Python 中 &(且)、|(或)、~(非)的优先级高于比较运算符(如 ==、>),不加括号会导致语法错误或逻辑错位。
常见错误现象:df[df.a > 1 & df.b 直接报 <code>ValueError: The truth value of a Series is ambiguous,因为解释器试图把整个 df.a > 1 & df.b 当作单个布尔值判断。
- 每个独立条件必须用圆括号包裹:写成
df[(df.a > 1) & (df.b -
&对应“且”,|对应“或”,~对应“非”——别用 Python 原生的and/or/not,它们不支持 Series - 多个条件连用时,括号层级要清晰,比如
((df.x == 'A') | (df.x == 'B')) & (df.y > 0)
用 query() 方法写条件更接近自然语言,但要注意字符串引号嵌套
query() 是 Pandas 提供的链式过滤接口,适合可读性要求高、条件较多的场景,底层仍转为布尔索引,性能略低但开发效率高。
使用场景:快速探索数据、Jupyter 中临时筛选、条件含变量插值。
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
- 字段名直接写,不用
df.前缀;字符串值用英文单引号或双引号,例如df.query("age > 25 and city == 'Beijing'") - 变量要用
@前缀引用,如threshold = 30; df.query("score > @threshold") - 字段名含空格或特殊字符,必须用反引号包裹:
df.query("`user id` > 100") - 不支持所有 NumPy 函数,比如
np.isnan()在query()里会报错,得换用isna()或改回布尔索引
处理缺失值时,isna() 和 notna() 比 == np.nan 可靠
NaN 不等于任何值,包括它自己,所以 df.col == np.nan 全返回 False,无法用于过滤。
正确做法始终用 Pandas 提供的空值判断方法:
- 筛选缺失值:
df[df.col.isna()]或df.query("col.isna()") - 筛选非缺失值:
df[df.col.notna()]或df.query("col.notna()") - 多条件组合时注意空值传播:比如
(df.a > 5) & df.b.isna()中,只要任一操作数为 NaN,对应位置结果就是False(不是NaN),这点和 SQL 的三值逻辑不同
性能敏感场景下,避免重复计算,优先用布尔索引而非多次 query()
每次调用 query() 都会解析字符串、构建表达式树并执行,而布尔索引是直接数组运算,速度更快,尤其在循环或大数据量下差异明显。
容易被忽略的地方:
- 如果要连续做多个过滤(比如先筛城市再筛年龄),不要写成
df.query("city=='Shanghai').query("age>30"),而是合并成一个表达式或用链式布尔索引 - 对同一列多次比较(如
df.col.between(10, 20))比(df.col >= 10) & (df.col 更简洁,语义明确且内部做了优化 - 涉及正则或复杂字符串匹配(如
str.contains())时,提前用.str访问器并注意na=False参数控制 NaN 行行为
isna()、高频操作别反复 query()。其他都是这三条的延伸。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










