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
相关产品推荐
相关产品推荐

