我不明白为什么sum(df ['series'])!= df ['series']。sum() - python

我正在汇总一系列值,但是根据我的操作方式,我会得到不同的结果。我尝试过的两种方法是:

sum(df['series'])

df['series'].sum()

他们为什么会返回不同的值?

示例代码。

s = pd.Series([
0.428229
 , -0.948957
 , -0.110125
 ,  0.791305
 ,  0.113980
 ,-0.479462
 ,-0.623440
 ,-0.610920
 ,-0.135165
 , 0.090192])

 print(s.sum())
 print(sum(s))

 -1.4843630000000003
 -1.4843629999999999

此处的差异很小,但是在具有数千个值的数据集中,差异变得很大。

python大神给出的解决方案

浮点数仅精确到一定数量的有效数字。想象一下,如果您所有的数字(包括中间结果)仅精确到两个有效数字,并且您想要列表[100, 1, 1, 1, 1, 1, 1]的总和。

“真实的”总和是106,但是由于我们只允许使用两个有效数字,因此无法表示。
正确答案为110,因为这是将“正确”的总和舍入为2平方英尺。
但是,如果我们天真地按顺序添加数字,我们将首先进行100 +1 = 100(至2平方英尺),然后进行100 + 1 = 100(至2平方英尺),依此类推,直到最终结果为100。

正确答案可以通过将数字从最小增加到最大来实现; 1 +1 = 2,然后2 +1 = 3,然后3 +1 = 4,然后4 +1 = 5,然后5 +1 = 6,然后6 + 100 = 110(至2平方呎)。但是,即使在一般情况下这也不起作用。如果有一百多个1,则中间和将开始不准确。总是将最小的两个余数相加,可以做得更好。

Python的内置sum函数使用朴素算法,而df['series'].sum()方法使用更精确的算法并具有较低的累积舍入误差。 From the numpy source code,熊猫使用:

对于浮点数,求和(和
np.add.reduce)通常通过直接添加每个数字来限制
逐个结果,在每个步骤中都会导致舍入错误。
但是,通常numpy将使用数值上更好的方法(部分
逐对求和),从而提高了许多用例的精度。
当没有给出axis时,始终提供改进的精度。

math.fsum function使用仍然更准确的算法:

与NumPy相比,Python的math.fsum函数使用速度较慢,但
更精确的求和方法。

对于您的列表,math.fsum的结果为-1.484363,这是正确舍入的答案。

快捷项目分配。无法将loc用于项目分配 - python

我有一个无法容纳在内存中的镶木地板文件文件夹,因此我正在使用dask来执行数据清理操作。我有一个要执行项目分配的功能,但似乎找不到任何在线解决方案可作为该特定功能的解决方案。以下是在熊猫中起作用的功能。如何在dask数据框中获得相同的结果?我认为延迟可能会有所帮助,但是我尝试编写的所有解决方案都没有起作用。def item_assignment(df): n…

Python pytz时区函数返回的时区为9分钟 - python

由于某些原因,我无法从以下代码中找出原因:>>> from pytz import timezone >>> timezone('America/Chicago') 我得到:<DstTzInfo 'America/Chicago' LMT-1 day, 18:09:00 STD…

Python:同时在for循环中添加到列表列表 - python

我想用for循环外的0索引值创建一个新列表,然后使用for循环添加到相同的列表。我的玩具示例是:import random data = ['t1', 't2', 't3'] masterlist = [['col1', 'animal1', 'an…

用大写字母拆分字符串,但忽略AAA Python Regex - python

我的正则表达式:vendor = "MyNameIsJoe. I'mWorkerInAAAinc." ven = re.split(r'(?<=[a-z])[A-Z]|[A-Z](?=[a-z])', vendor) 以大写字母分割字符串,例如:'我的名字是乔。 I'mWorkerInAAAinc”变成…

Python:来自dict系列的Pandas数据框 - python

我有一个熊猫数据框:type(original) pandas.core.frame.DataFrame 其中包括系列对象original['user']:type(original['user']) pandas.core.series.Series original['user']指向许多命令:…