如何在Polars中表示用于全量过滤的恒等表达式?
在Polars中表示恒等过滤表达式
你可以直接使用pl.lit(True)来创建一个恒等布尔表达式,它会对所有行返回True,执行lf.filter(pl.lit(True))就会返回完整的数据集,完全匹配你的需求。
你的替代方案存在隐患
你当前使用的(pl.col("a") == 0) | (pl.col("a") != 0)有两个明显问题:
- 依赖列
a必须存在于数据集中,否则会直接报错 - 如果列
a包含null值,两个比较的结果都是null,逻辑或运算后仍为null,而Polars的filter会自动排除null对应的行,导致你丢失这些数据
示例代码
import polars as pl lf = pl.LazyFrame({"a": [1, 2, None, 4]}) # 正确的恒等过滤,保留所有行 result = lf.filter(pl.lit(True)).collect() print(result) # 输出: # shape: (4, 1) # ┌──────┐ # │ a │ # │ --- │ # │ i64 │ # ╞══════╡ # │ 1 │ # │ 2 │ # │ null │ # │ 4 │ # └──────┘ # 你的方案会丢失null行 result_old = lf.filter((pl.col("a") == 0) | (pl.col("a") != 0)).collect() print(result_old) # 输出: # shape: (3, 1) # ┌─────┐ # │ a │ # │ --- │ # │ i64 │ # ╞═════╡ # │ 1 │ # │ 2 │ # │ 4 │ # └─────┘
另外补充一点:如果只是单纯想获取完整数据集,其实不需要调用filter,直接对LazyFrame执行collect()即可;但如果是在必须传递过滤表达式的场景(比如函数参数要求传入表达式),pl.lit(True)就是最稳妥的选择。
内容的提问来源于stack exchange,提问作者user3414663
相关产品推荐
相关产品推荐

