使用pandas计算新列时浮点数等值判断不匹配问题咨询
问题根因
该问题是浮点数精度误差导致的,属于计算机浮点数存储与运算的通用特性,和pandas、numpy的逻辑无关。
你看到的CPS Gross列两行都显示为0.05,只是pandas默认打印时截断了小数位,你可以执行以下代码打印更高精度的数值,就能看到明显差异:
print(df["CPS Gross"].apply(lambda x: format(x, '.20f')))
第二行的运算结果实际是和0.05极其接近但不完全相等的数值,所以用==做精确匹配时会判定不满足条件。
出现这个误差的原因是:0.05、236.05、82.35这类十进制小数,转成计算机底层存储的二进制浮点数时,会出现无限循环的情况,只能做近似存储,多次运算后误差就会显现出来。
解决方案
不要直接用==做浮点数的相等判断,改用近似匹配的方式即可:
- 用numpy内置的
np.isclose方法,自动判断两个浮点数的差值是否在可接受的极小误差范围内:
conditions = [np.isclose(df["CPS Gross"], 0.05)] values = [0.03] df["CPS Calc"] = np.select(conditions,values)
- 如果业务上只需要判断保留固定位数后的结果是否相等,也可以先对
CPS Gross做小数位截断再匹配:
# 示例保留2位小数后判断 conditions = [df["CPS Gross"].round(2) == 0.05]
内容的提问来源于stack exchange,提问作者Pedro Schneider
相关产品推荐
相关产品推荐

