如何在Polars中正确组合多条件过滤?
解决Pokémon数据集过滤条件的正确姿势
问题关键
你要排除的是同时符合Type 1 = Dragon且Total = 600的那一行,核心是搞对逻辑条件的优先级和取反范围。
为啥之前出错
第一个错误(
TypeError):&的优先级比!=高,代码会先算"Dragon" & pl.col("Total")——这相当于把字符串和Polars表达式硬凑一起做按位运算,肯定会报错。必须给每个独立条件套括号,明确先判断每个条件,再做逻辑运算。第二个错误(误删太多行):
用.ne()时如果写成pl.col("Type 1").ne("Dragon") & pl.col("Total").ne(600),逻辑变成了“Type1不是Dragon 而且 Total不是600”——这会把所有Dragon类型的行(不管Total是不是600)、所有Total=600的行(不管Type1是不是Dragon)都删掉,完全不是你要的效果。
正确写法
有两种等价的正确方式,随便选哪种:
方式1:直接排除联合条件
把“同时满足两个条件”的情况用括号包起来,再取反(~表示逻辑非):
df.filter(~((pl.col("Type 1") == "Dragon") & (pl.col("Total") == 600)))
这里每个条件都套括号,可读性拉满,不容易出错。
方式2:用逻辑转换(德摩根定律)
根据逻辑规则,不是(A且B)等价于不是A 或者 不是B,所以也能这么写:
df.filter((pl.col("Type 1") != "Dragon") | (pl.col("Total") != 600))
同样要给每个条件加括号,避免优先级坑。
效果验证
这两种写法都会精准删掉那一行同时符合两个条件的数据,其他行全保留,正好符合你的需求。
内容的提问来源于stack exchange,提问作者bbgatch
相关产品推荐
相关产品推荐

