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

Polars中assert_frame_equal断言失败时,如何定位含Null的Bool列差异?

定位Polars含Null的Bool列DataFrame差异

在Polars中直接使用!=比较DataFrame时,由于Null传播规则,当其中一个值为Null时,比较结果会是Null而非True,这会导致你无法捕获"Null与非Null"这类差异。要准确定位含Null的Bool列差异,需要同时判断值不相等和Null状态不一致两种情况。

针对单个目标列的定位方法

如果你已经知道差异出现在某一列(比如示例中的value列),可以直接构造包含Null判断的掩码:

import polars as pl

df1 = pl.DataFrame(
    {
        "group": ["A", "A", "A", "B", "B"], 
        "value": [True, False, None, False, None]
    }
)
df2 = pl.DataFrame(
    {
        "group": ["A", "A", "A", "B", "B"], 
        "value": [True, False, False, False, None]
    }
)

target_col = "value"
# 构造完整差异掩码:值不等 或 一边是Null另一边不是
diff_mask = (df1[target_col] != df2[target_col]) | (df1[target_col].is_null() != df2[target_col].is_null())

# 提取差异行并显示左右两边的值
diff_rows = df1.with_columns(
    right_value=df2[target_col],
    is_diff=diff_mask
).filter(diff_mask)

print(diff_rows)

运行后会输出明确的差异行:

shape: (1, 4)
┌───────┬───────┬────────────┬────────┐
│ group ┆ value ┆ right_value ┆ is_diff │
│ ---   ┆ ---   ┆ ---        ┆ ---    │
│ str   ┆ bool  ┆ bool       ┆ bool   │
╞═══════╪═══════╪════════════╪════════╡
│ A     ┆ null  ┆ false      ┆ true   │
└───────┴───────┴────────────┴────────┘

针对整个DataFrame的通用方法

如果需要检查所有列的差异,可以构造横向掩码来标记任意一列存在差异的行:

# 构造全列差异掩码
full_mask = pl.all_horizontal(
    [(df1[col] != df2[col]) | (df1[col].is_null() != df2[col].is_null()) for col in df1.columns]
)

# 提取所有存在差异的行,并合并左右DataFrame的内容
full_diff = df1.join(df2, on=df1.columns, how="full", suffix="_right").filter(full_mask)

print(full_diff)

关键逻辑说明

  • (df1[col] != df2[col]):捕获非Null值之间的不等情况
  • (df1[col].is_null() != df2[col].is_null()):捕获"一边是Null、另一边是非Null"的差异情况
  • 用|(逻辑或)合并两个条件,确保所有类型的差异都被标记

内容的提问来源于stack exchange,提问作者Andi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 06:54:53