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

Python中检查DataFrame浮点数列相等性的报错问题

解决Pandas中浮点数逐行近似相等判断的问题

你的问题出在对assert_almost_equal的用法理解上,还有浮点数比较的常见坑,我来一步步帮你搞定:

为什么你的代码报错?

np.assert_almost_equal是断言函数,它的作用是验证两个数组是否近似相等——如果相等就返回None,不相等直接抛出AssertionError,根本不会返回布尔数组。而np.where需要的是一个明确的布尔序列来做判断,所以把它放进去就会触发"真值模糊"的错误,因为Python没法把None或者异常转换成布尔值来逐行判断。

另外,直接用df['col1'] == df['col2']比较浮点数也不靠谱,比如0.1 + 0.2和0.3在计算机里存储的二进制值并不完全一致,用==会误判它们不相等,必须用近似相等的判断逻辑。

正确的解决方案

步骤1:先筛选掉含0的行

先把两列都不为0的行筛选出来(注意要加.copy()避免链式赋值警告):

import pandas as pd
import numpy as np

# 假设你的DataFrame是df
filtered_df = df[(df['col1'] != 0.0) & (df['col2'] != 0.0)].copy()

步骤2:用np.isclose逐行判断近似相等

np.isclose是专门用来处理浮点数近似相等的向量化函数,速度快还能避免精度问题,默认的公差是1e-09,你可以通过rtol(相对公差)和atol(绝对公差)参数调整严格程度:

# 相等则留空,不相等标记为"Not equal"
filtered_df['Error'] = np.where(np.isclose(filtered_df['col1'], filtered_df['col2']), '', 'Not equal')

可选:逐行apply的方式(适合小数据集)

如果你习惯逐行处理,也可以用apply,但效率不如向量化的np.isclose,适合数据量小的情况:

filtered_df['Error'] = filtered_df.apply(
    lambda row: '' if np.isclose(row['col1'], row['col2']) else 'Not equal',
    axis=1
)

完整示例

比如你的原始数据是这样的:

data = {'col1': [1.0, 2.0, 0.0, 3.000000001], 'col2': [1.0, 2.1, 5.0, 3.0]}
df = pd.DataFrame(data)

运行上面的代码后,filtered_df的结果会是:

col1  col2       Error
0  1.000000   1.0            
1  2.000000   2.1  Not equal
3  3.000000   3.0            

可以看到第三行的3.000000001和3.0被判定为近似相等,没有标记错误,这正是我们想要的浮点数比较结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:38:58