如何筛选Polars DataFrame中列值不同(含Null)的行
Polars筛选包含Null的不等值行问题
给定Polars DataFrame:
import polars as pl df = pl.DataFrame({'col1': [1,2,3], 'col2': [1, None, None]})
实际数据内容:
┌──────┬──────┐ │ col1 ┆ col2 │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞══════╪══════╡ │ 1 ┆ 1 │ │ 2 ┆ null │ │ 3 ┆ null │ └──────┴──────┘
需求是筛选出col1与col2值不同的行(包含其中一列为Null的情况),但尝试以下过滤命令均返回空行:
df.filter(pl.col('col1')!=pl.col('col2'))df.filter(~pl.col('col1')==pl.col('col2'))df.filter(~pl.col('col1').eq(pl.col('col2')))
问题原因
Polars中,任何与Null的比较运算结果都是Null,而filter会自动将Null视为False过滤掉。例如2 != null返回Null,pl.col('col1').eq(pl.col('col2'))在col2为Null时也返回Null,取反后仍是Null,最终这些行都被过滤。
正确过滤命令
方法1:显式处理Null情况
通过逻辑或(|)同时判断"值不等"和"任意一列为Null"的情况:
# 针对当前场景(仅col2可能为Null) df.filter(pl.col('col1').ne(pl.col('col2')) | pl.col('col2').is_null()) # 通用场景(任意一列可能为Null) df.filter(pl.col('col1').ne(pl.col('col2')) | pl.col('col1').is_null() | pl.col('col2').is_null())
方法2:使用neq函数(Polars v0.19+)
Polars 0.19及以上版本提供的neq函数会自动处理Null:当其中一个值为Null时,直接判定为不相等(返回True),无需额外判断:
df.filter(pl.col('col1').neq(pl.col('col2')))
执行结果
运行上述正确命令后,将得到目标行:
┌──────┬──────┐ │ col1 ┆ col2 │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞══════╪══════╡ │ 2 ┆ null │ │ 3 ┆ null │ └──────┴──────┘
内容的提问来源于stack exchange,提问作者Max Power
相关产品推荐
相关产品推荐

