Pandas中使用query函数实现多列组合条件过滤的方法
Pandas 多条件行筛选实现说明
常见报错原因排查
- 你之前使用
df.query("AD65 == 'notnull' & B14 == 'Machine'")返回空结果,核心是语法使用错误:该写法本质是匹配AD65列值等于字符串"notnull"的行,并不是判断列值非空,自然无法返回目标数据。 - 布尔索引组合多条件时,每个独立判断表达式必须用英文圆括号包裹,否则会因Python运算符优先级问题出现逻辑计算错误。
正确筛选实现方案
方案1:布尔索引组合(兼容性最强,无语法适配问题)
两个筛选条件用&连接,每段逻辑单独加括号即可:
# 同时满足:AD65列无空值、B14列值为"Machine" result_df = df[(df["AD65"].notnull()) & (df["B14"] == "Machine")]
注:Pandas中notnull()和notna()方法完全等价,你之前单独编写的df.AD65.notnull()非空筛选逻辑是正确的。
方案2:修正后的query函数写法
如果习惯使用query做筛选,把非空判断改成对应方法调用即可:
result_df = df.query("AD65.notnull() & B14 == 'Machine'")
循环遍历适配说明
- 常规静态DataFrame完成一次筛选后,不需要把筛选逻辑放入while循环,直接用for循环遍历筛选结果即可,两种常用遍历方式:
- 逐行获取全列值(适合需要操作行内多列的场景)
for _, row in result_df.iterrows(): # 直接通过列名取当前行的值,编写后续处理逻辑 ad65_val = row["AD65"] w70_val = row["W70"]- 按列批量取值(适合大表遍历,运行性能更高)
for ad65_val, b14_val in zip(result_df["AD65"], result_df["B14"]): # 直接操作两列的对应值,比iterrows遍历速度快数倍 - while循环仅适用于需要动态触发筛选的场景(比如拉取增量数据直到满足固定行数、根据外部状态反复重新筛选数据),针对内存中已存在的静态DataFrame,单次筛选+for循环的实现是最简洁高效的方案,强行嵌套while会徒增代码复杂度。
内容的提问来源于stack exchange,提问作者Shanu
相关产品推荐
相关产品推荐

