Python怎么进行多条件数据筛选_Pandas布尔索引实战

张开发
2026/4/21 9:35:14 15 分钟阅读

分享文章

Python怎么进行多条件数据筛选_Pandas布尔索引实战
多条件筛选必须用 、|、~ 且每条件加括号禁用 and/or/not缺失值判断用 isna()/notna()禁用 np.nan字符串列需先转数值再比较。用 df[condition1 condition2] 做多条件筛选别用 and直接用 Python 的 and 会报 ValueError: The truth value of a Series is ambiguous —— 因为 Pandas 的布尔序列不能当单个布尔值用。位与才是正确操作符它逐元素计算返回同样长度的布尔 Series。常见错误现象写成 df[df.a 1 and df.b x]一运行就崩或者误用 and / or / not全都不行。必须用 、|、~且每个条件**必须用括号包住**运算符优先级高不加括号会出错df[(df.age 25) (df.city Beijing) (df.salary 8000)] 是安全写法df[df.age 25 df.city Beijing] 会先算 25 df.city直接报错字符串比较注意大小写和空格df.name.str.contains(abc) 比 df.name abc 更常用但默认区分大小写处理缺失值时isna() 和 notna() 比 None 或 ! np.nan 可靠NaN 在 Pandas 里不等于任何值包括它自己。所以 df.col np.nan 全是 Falsedf.col ! np.nan 也全是 True —— 完全不可用。查缺失用 df[df.col.isna()] 或 df[df.col.isnull()]二者等价查非缺失用 df[df.col.notna()]别写 df[df.col ! np.nan] 或 df[~(df.col.isna())]后者虽能用但多一层否定易读性差多条件组合时缺失判断要和其他条件用 连接比如df[(df.score 60) df.name.notna()]用 query() 写复杂条件更简洁但要注意变量注入和性能差异df.query(age 25 and city in [Beijing, Shanghai]) 比链式布尔索引少写一堆 df. 和括号尤其适合动态条件或长表达式。立即学习“Python免费学习笔记深入”想用外部变量加 前缀min_score 60; df.query(score min_score)不加 就当成列名找列名含空格或特殊字符用反引号df.query(user id 100)性能上query() 底层用 numexpr大数据量千万行以上可能比布尔索引快但小数据几万行内差别不大且 query() 不支持所有 Pandas 表达式比如不能调用自定义函数字符串数值混合条件容易漏掉类型转换astype() 要提前做比如从 CSV 读入的数字列被当成了字符串常见于有空值或单位符号的列df[df.price 100] 会静默失败或报错 TypeError: not supported between instances of str and int。先检查类型df.price.dtype如果是 object大概率是字符串转数值前先清理df.price.str.replace(, ).str.strip().astype(float)别直接 astype(float)否则遇到 N/A 就崩稳妥做法用 pd.to_numeric(df.price, errorscoerce)把非法值变 NaN再配合 notna() 过滤事情说清了就结束。最常踩的坑其实是括号没加、and 没换 、以及 NaN 判断写错——这三处一错整个筛选就失效而且错误信息还不直观。

更多文章