使用Polars表达式展开简化OR过滤谓词链
Polars表达式展开简化OR过滤谓词链
当然可以!你这里重复的过滤逻辑完全可以通过Polars的表达式特性来简化,完美符合DRY原则,还能让代码更清爽。下面给你两种实用的简化方式:
方法1:封装复用的自定义表达式函数
把重复的~pl.col(col).is_in([None, 0])逻辑封装成一个小函数,以后需要用到这个过滤条件的地方直接调用就行,修改条件也只需要改一处:
import polars as pl df = pl.DataFrame( { "a": [1, 2, 3, 4, 5], "val1": [1, None, 0, 0, None], "val2": [1, None, None, 0, 1], } ) # 把重复的过滤逻辑封装成函数 def is_valid(col_name): return ~pl.col(col_name).is_in([None, 0]) # 用自定义函数简化filter语句 result = df.filter(is_valid("val1") | is_valid("val2")) print(result)
方法2:用pl.any_horizontal批量处理多列
如果你的需求是任意一列满足过滤条件就保留该行,那pl.any_horizontal简直是为这个场景量身定做的!它会对指定的所有列应用同一个表达式,然后返回每行是否有任意一个结果为True,完美替代手动写一串OR连接的谓词:
import polars as pl df = pl.DataFrame( { "a": [1, 2, 3, 4, 5], "val1": [1, None, 0, 0, None], "val2": [1, None, None, 0, 1], } ) # 用any_horizontal批量处理多列,自动实现OR逻辑 result = df.filter( pl.any_horizontal(~pl.col("val1", "val2").is_in([None, 0])) ) print(result)
两种方法都能得到你预期的结果:
┌─────┬──────┬──────┐ │ a ┆ val1 ┆ val2 │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 │ ╞═════╪══════╪══════╡ │ 1 ┆ 1 ┆ 1 │ │ 5 ┆ null ┆ 1 │ └─────┴──────┴──────┘
要是以后需要添加更多列(比如val3、val4),第二种方法只需要把列名加到pl.col()的参数里就行,维护起来超省心!
备注:内容来源于stack exchange,提问作者mouwsy
相关产品推荐
相关产品推荐

