如何在Pandas中使用OR语句实现多条件链式筛选
Pandas链式编写多筛选条件(含or逻辑)的解决方案
首先你给出的示例代码存在两个可优化点:
- 语法括号不全,且Python原生
or不能直接用于Pandas向量化条件筛选,需要改用按位或运算符| &/|运算符优先级高于比较运算符,每个独立判断条件必须用小括号包裹,否则会出现运算顺序错误
方法1:使用query()方法(最简洁,推荐)
query是Pandas专门为链式操作设计的筛选方法,支持直接写逻辑表达式,无需重复写df.前缀,还可以直接用and/or写法,可无缝拼接在其他Pandas操作之后:
# 基础链式筛选 res = df.query("(col1 > 2 and col2 < 5) or (col5 == 5 and col3 >= 78)") # 多操作链式示例(前面接分组、聚合等操作都可以直接拼接) res = df.groupby("col1", as_index=False).sum().reset_index().query("(col1 > 2 and col2 < 5) or (col5 == 5 and col3 >= 78)")
方法2:使用loc+lambda实现链式筛选
如果习惯原生Pandas条件写法,可以用lambda接收链式过程中的临时DataFrame,无需提前赋值变量:
res = df.loc[lambda df_: (df_.col1 > 2) & (df_.col2 < 5) | (df_.col5 == 5) & (df_.col3 >= 78)]
注意事项
- 非
query场景下,禁止使用Python原生and/or/not做向量化条件判断,需替换为&/|/~ - 所有独立比较条件必须用小括号包裹,避免运算符优先级导致的逻辑错误
内容的提问来源于stack exchange,提问作者Paul Tembo
相关产品推荐
相关产品推荐

