为什么 Python 的 sum() 和 Pandas 的 sum() 会产生不同的结果

问题描述 投票:0回答:1

为什么 Pandas

sum()
和 Python
sum()
在浮点数列表上产生稍微不同的结果,在对结果进行舍入时产生差异

>>> import pandas as pd
>>> from decimal import Decimal
>>> numbers = [0.495,1.495,2.495,3.495,4.495,5.495,6.495, 7.495,8.495, 9.495, 10.495]
>>> Decimal(sum(numbers))
Decimal('60.44500000000000028421709430404007434844970703125')
>>> round(Decimal(sum(numbers)),2)
Decimal('60.45')
>>> Decimal(float(pd.DataFrame(numbers).sum()))
Decimal('60.44499999999999317878973670303821563720703125')
>>> round(Decimal(float(pd.DataFrame(numbers).sum())),2)
Decimal('60.44')

因此,尽管使用相同的

round()
函数,Pandas 和 Python 之间数字
sum()
的细微差别足以产生不同的结果。

我还注意到,如果数字的顺序颠倒,Pandas 会产生不同的结果,这与 Python 中的标准

sum()
相反:

>>> Decimal(sum(reversed(numbers)))
Decimal('60.44500000000000028421709430404007434844970703125').  # the same as unreversed
>>> Decimal(float(pd.DataFrame(reversed(numbers)).sum()))
Decimal('60.44499999999998607336237910203635692596435546875').  # different from unreversed

崇敬列表和未颠倒列表的总和结果差异很小。但到目前为止我认为浮点加法应该是可交换的。熊猫的情况似乎并非如此。

那么为什么 Pandas

sum()
对于浮点数产生与 Python
sum()
不同的结果呢?为什么在简单地恢复数字时会产生不同的结果?这是一个错误还是 Pandas 浮点加法的一个功能? (或者这与我的底层硬件有关?我在 Mac OS 14.1.1 和 Apple M3 Pro 芯片上使用 Python 3.12 和 Pandas 2.2.2)

python pandas sum floating-point precision
1个回答
0
投票

以下是导致结果不同的原因:

1- 浮点运算的精度:由于实数仅以二进制格式表示,因此计算机上的浮点运算本质上是不精确的。这可能会导致舍入错误,特别是当您对大量浮点值求和或同时运行多个进程时。

2- 算法变化:当对数字求和时,Pandas 可能会采用与 Python 内置 sum() 函数不同的算法或优化。这些变化可能会导致舍入误差有所不同,特别是在涉及边缘情况或某些输入模式的情况下。

3- 运算顺序:由于精度问题,浮点加法通常不可交换。当添加大量不同大小的数字时,不同的加法顺序可能会产生舍入误差。

© www.soinside.com 2019 - 2024. All rights reserved.