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

如何优化Polars中同结构DataFrame差异值统计的实现?

纯Polars实现统计两个DataFrame的差异值数量

问题背景

给定两个形状相同的Polars DataFrame,需要统计二者间不同值的总数,包含两种场景:

  • 对应位置的值不相等
  • 其中一方为缺失值(NaN/Null),另一方为非缺失值

现有实现需要转换为NumPy数组完成统计,希望找到更高效的纯Polars原生方案。

优化后的实现代码

import polars as pl

def count_differences(df1: pl.DataFrame, df2: pl.DataFrame) -> int:
    assert df1.shape == df2.shape, "DataFrames must have the same shape"
    
    # 逐列计算差异数:值不同 或 缺失状态不同
    diff_counts = df1.select(
        pl.sum(
            (pl.col(c) != df2[c]).fill_null(False) | 
            (pl.col(c).is_null() != df2[c].is_null())
        ) for c in df1.columns
    )
    
    # 汇总所有列的差异数得到总数
    return diff_counts.sum(axis=1).item()

实现思路

这个方案全程基于Polars原生API,无需转换为NumPy数组,核心逻辑拆解:

  1. 值差异判断:用pl.col(c) != df2[c]比较对应位置的值,但Polars中只要有一方是Null/NaN,比较结果会是Null,所以用fill_null(False)把这些Null转为False——因为缺失状态的差异会单独处理。
  2. 缺失状态差异判断:直接用pl.col(c).is_null() != df2[c].is_null()对比两个DataFrame对应位置的缺失状态是否不同。
  3. 汇总统计:用pl.sum()统计每列中满足任一差异条件的行数,最后把所有列的结果求和,得到全局的差异总数。

测试验证

用原测试用例验证结果一致:

df1 = pl.DataFrame({
    "name": ["José", "George", "George"],
    "age": [28.2, float("nan"), None]
})

# 测试1:填充Null为0
df2 = df1.fill_null(0)
print(count_differences(df1, df2))  # 输出1

# 测试2:填充NaN为0
df2 = df1.fill_nan(0)
print(count_differences(df1, df2))  # 输出1

# 测试3:替换name列的George为Mark
df2 = df1.with_columns(pl.col("name").replace("George", "Mark"))
print(count_differences(df1, df2))  # 输出2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 01:20:07