You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 15:14:48