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

基础筛选逻辑回顾
单个布尔条件的筛选比较简单,直接把条件表达式放在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的逻辑运算符,不需要换成位运算符,写起来更简洁,适合条件比较复杂的场景。