如何优化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数组,核心逻辑拆解:
- 值差异判断:用
pl.col(c) != df2[c]比较对应位置的值,但Polars中只要有一方是Null/NaN,比较结果会是Null,所以用fill_null(False)把这些Null转为False——因为缺失状态的差异会单独处理。 - 缺失状态差异判断:直接用
pl.col(c).is_null() != df2[c].is_null()对比两个DataFrame对应位置的缺失状态是否不同。 - 汇总统计:用
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
相关产品推荐
相关产品推荐

