我正在汇总一系列值,但是根据我的操作方式,我会得到不同的结果。我尝试过的两种方法是:
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
,这是正确舍入的答案。
我有一个无法容纳在内存中的镶木地板文件文件夹,因此我正在使用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']指向许多命令:…