如何在 Pandas 中正确组合多个布尔条件进行数据筛选

来源:AI大模型作者:河北彩花头衔:网络博主
导读:本期聚焦于小伙伴创作的《如何在 Pandas 中正确组合多个布尔条件进行数据筛选》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何在 Pandas 中正确组合多个布尔条件进行数据筛选》有用,将其分享出去将是对创作者最好的鼓励。

在Pandas的数据分析场景中,经常需要从DataFrame里筛选出同时满足多个特征的数据行,比如筛选出年龄大于20岁且分数在80分以上的学生记录,这就需要正确组合多个布尔条件来实现筛选逻辑。

如何在 Pandas 中正确组合多个布尔条件进行数据筛选

基础筛选逻辑回顾

单个布尔条件的筛选比较简单,直接把条件表达式放在DataFrame的方括号里即可,比如筛选df里age列大于20的所有行:

import pandas as pd

# 构造示例数据
data = {
    "name": ["张三", "李四", "王五", "赵六"],
    "age": [18, 22, 25, 19],
    "score": [75, 88, 92, 60]
}
df = pd.DataFrame(data)

# 单个条件筛选:年龄大于20岁
single_condition_result = df[df["age"] > 20]
print(single_condition_result)

多个布尔条件的组合规则

Pandas中组合多个布尔条件不能直接使用Python的逻辑运算符and、or、not,必须使用位运算符&(与)、|(或)、~(非),同时每个独立的条件都需要用括号包裹,否则会出现运算符优先级导致的错误。

与条件组合(同时满足多个条件)

当需要筛选同时满足两个及以上条件的数据时,使用&连接各个条件,每个条件都要单独加括号:

# 筛选年龄大于20岁 且 分数大于等于80分的记录
and_condition_result = df[(df["age"] > 20) & (df["score"] >= 80)]
print(and_condition_result)

或条件组合(满足任意一个条件即可)

当需要筛选满足多个条件中任意一个的数据时,使用|连接各个条件,同样每个条件都要加括号:

# 筛选年龄小于20岁 或者 分数小于70分的记录
or_condition_result = df[(df["age"] < 20) | (df["score"] < 70)]
print(or_condition_result)

非条件使用(排除某个条件)

当需要排除符合某个条件的数据时,使用~对条件取反:

# 筛选分数不是小于70分的记录,即分数大于等于70分
not_condition_result = df[~(df["score"] < 70)]
print(not_condition_result)

常见错误与解决方法

错误1:使用and/or/not代替位运算符

很多初学者会直接用Python的逻辑运算符组合条件,比如写df[df["age"] > 20 and df["score"] > 80],这会直接抛出ValueError,因为and无法处理Pandas的布尔序列。解决方法就是替换成对应的位运算符,同时给每个条件加括号。

错误2:条件没有加括号

如果不给独立条件加括号,比如写df[df["age"] > 20 & df["score"] > 80],会因为运算符优先级问题导致结果错误,>的优先级高于&,会先计算20 & df["score"]再和df["age"]比较,完全不符合预期。解决方法就是给每个独立条件加上括号。

错误3:条件数据类型不是布尔型

如果筛选条件的结果不是布尔序列,比如直接写df[df["age"]],会报错或者筛选出错误数据。要确保每个条件表达式的结果都是布尔值,比如列的比较、成员判断等。

复杂条件组合示例

实际场景中可能会有更复杂的组合需求,比如同时满足三个条件,或者混合与或逻辑:

# 筛选:(年龄大于20岁 且 分数大于等于80分) 或者 名字是赵六的记录
complex_condition_result = df[((df["age"] > 20) & (df["score"] >= 80)) | (df["name"] == "赵六")]
print(complex_condition_result)

这种混合逻辑的条件要注意括号的层级,先算最内层的与条件,再算外层的或条件,避免优先级问题。

使用query方法简化条件组合

除了用位运算符组合条件,Pandas还提供了query方法,支持用字符串形式写筛选条件,语法更接近自然逻辑,不需要写大量的括号和df引用:

# 用query实现年龄大于20且分数大于等于80的筛选
query_result = df.query("age > 20 and score >= 80")
print(query_result)

# 混合条件也可以用query实现
complex_query_result = df.query("(age > 20 and score >= 80) or name == '赵六'")
print(complex_query_result)

query方法里的and、or、not可以直接使用Python的逻辑运算符,不需要换成位运算符,写起来更简洁,适合条件比较复杂的场景。

Pandas布尔条件数据筛选DataFrame修改时间:2026-07-07 12:48:25

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。