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

如何筛选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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 13:45:54