Polars中如何筛选datetime列大于指定值且保留Null值?
解决Polars筛选Datetime列时保留Null值的问题
错误原因
你遇到的InvalidOperationError是运算符优先级导致的:>=的优先级高于|,代码会先尝试对datetime(2023, 8, 31)和pl.col("end_date").is_null()执行按位或操作,而Datetime类型与布尔类型不支持该操作,因此报错。
正确解决方法
以下三种方式都可以实现筛选需求(保留end_date大于等于指定日期或为Null的行):
方法1:给条件添加括号,明确运算顺序
通过括号强制先计算两个布尔条件,再执行逻辑或:
from datetime import datetime import polars as pl df.filter( (pl.col("end_date") >= datetime(2023, 8, 31)) | pl.col("end_date").is_null() )
方法2:使用Polars内置的or_()方法
直接调用布尔系列的or_()方法组合条件,彻底避免优先级问题:
df.filter( pl.col("end_date").ge(datetime(2023, 8, 31)).or_(pl.col("end_date").is_null()) )
方法3:使用pl.any_horizontal组合多条件
适合需要同时判断多个布尔条件的场景,可读性更强:
df.filter( pl.any_horizontal( pl.col("end_date") >= datetime(2023, 8, 31), pl.col("end_date").is_null() ) )
效果验证
执行上述任意代码后,DataFrame会保留所有end_date满足>=2023-08-31的行,以及end_date为Null的行,完全符合筛选需求。
内容的提问来源于stack exchange,提问作者Vega
相关产品推荐
相关产品推荐

