You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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循环遍历筛选结果即可,两种常用遍历方式:
    1. 逐行获取全列值(适合需要操作行内多列的场景)
    for _, row in result_df.iterrows():
        # 直接通过列名取当前行的值,编写后续处理逻辑
        ad65_val = row["AD65"]
        w70_val = row["W70"]
    
    1. 按列批量取值(适合大表遍历,运行性能更高)
    for ad65_val, b14_val in zip(result_df["AD65"], result_df["B14"]):
        # 直接操作两列的对应值,比iterrows遍历速度快数倍
    
  • while循环仅适用于需要动态触发筛选的场景(比如拉取增量数据直到满足固定行数、根据外部状态反复重新筛选数据),针对内存中已存在的静态DataFrame,单次筛选+for循环的实现是最简洁高效的方案,强行嵌套while会徒增代码复杂度。

内容的提问来源于stack exchange,提问作者Shanu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.29 02:36:03