pandas 中的 .sum() 方法给出不一致的结果

2024-03-01

我有一个大的 DataFrame(大约 4e+07 行)。

总结时,我得到2 显着不同的结果我是否做总和之前或之后列选择。
另外,类型变化从 float32 到 float64,即使总数均低于 2**31

df[[col1, col2, col3]].sum()
Out[1]:
col1         9.36e+07
col2         1.39e+09
col3         6.37e+08
dtype: float32

df.sum()[[col1, col2, col3]]
Out[2]:
col1         1.21e+08
col2         1.70e+09
col3         7.32e+08
dtype: float64

我显然错过了一些东西,有人遇到同样的问题吗?

感谢您的帮助。


要了解这里发生了什么,您需要了解 Pandas 在幕后做了什么。我将稍微简化一下,因为有很多花哨的东西和特殊情况需要考虑,但大致如下:

假设你有一只熊猫DataFrame object df具有各种数字列(我们将忽略日期时间列、分类列等)。当你计算时df.sum(),熊猫:

  1. 提取值 https://github.com/pandas-dev/pandas/blob/81372093f1fdc0c07e4b45ba0f47b0360fabd405/pandas/core/nanops.py#L308将数据帧转换为二维 NumPy 数组。
  2. 应用 NumPysum功能 https://github.com/pandas-dev/pandas/blob/81372093f1fdc0c07e4b45ba0f47b0360fabd405/pandas/core/nanops.py#L314到那个二维数组axis=0计算列总和。

这是这里很重要的第一步。 a 的列DataFrame可能有不同的数据类型,但 2d NumPy 数组只能有一个数据类型。如果df有一个混合物float32 and int32列(例如),Pandas 必须选择一个同时适合两列的数据类型,在这种情况下,它选择float64。因此,当计算总和时,会使用双精度算术根据双精度值进行计算。这就是您的第二个示例中发生的情况。

另一方面,如果你减少到只float32首先,Pandas 可以并且将会使用列float322d NumPy 数组的 dtype,所以sum计算以单精度执行。这就是您的第一个示例中发生的情况。

下面是一个简单的示例,展示了这一点:我们将设置一个包含 1 亿行和三列数据类型的 DataFramefloat32, float32 and int32分别。所有的值都是:

>>> import numpy as np, pandas as pd
>>> s = np.ones(10**8, dtype=np.float32)
>>> t = np.ones(10**8, dtype=np.int32)
>>> df = pd.DataFrame(dict(A=s, B=s, C=t))
>>> df.head()
     A    B  C
0  1.0  1.0  1
1  1.0  1.0  1
2  1.0  1.0  1
3  1.0  1.0  1
4  1.0  1.0  1
>>> df.dtypes
A    float32
B    float32
C      int32
dtype: object

现在,当我们直接计算总和时,Pandas 首先将所有内容转换为float64s。计算也使用以下方法完成float64输入所有三列,我们就会得到准确的答案。

>>> df.sum()
A    100000000.0
B    100000000.0
C    100000000.0
dtype: float64

但是如果我们首先将数据框缩减为float32列,然后float32- 算术用于求和,我们得到的答案很差。

>>> df[['A', 'B']].sum()
A    16777216.0
B    16777216.0
dtype: float32

不准确当然是由于使用的数据类型对于所讨论的任务没有足够的精度:在求和的某个时刻,我们最终会重复添加1.0 to 16777216.0,并得到16777216.0每次回来,感谢常见的浮点问题 https://stackoverflow.com/q/12596695/270986。解决方案是显式转换为float64在进行计算之前自己进行计算。

然而,Pandas 为我们带来的惊喜还没有结束。使用与上面相同的数据框,让我们尝试计算列的总和"A":

>>> df[['A']].sum()
A    100000000.0
dtype: float32

突然之间,我们又获得了完全的准确性!发生什么了?这与 dtypes 关系不大:我们仍在使用float32进行求和。现在是second造成差异的步骤(NumPy 求和)。正在发生的事情是 NumPy 可以而且有时确实使用一种更准确的求和算法,称为两两求和 https://en.wikipedia.org/wiki/Pairwise_summation, 与float32dtype 和我们使用的大小数组,其准确性会对最终结果产生巨大的影响。但是,它仅在沿数组变化最快的轴求和时才使用该算法;看这个 NumPy 问题 https://github.com/numpy/numpy/issues/9393进行相关讨论。在我们计算两列总和的情况下"A" and column "B",我们最终得到一个形状的值数组(100000000, 2)。变化最快的轴是轴 1,而我们沿轴 0 计算总和,因此使用了朴素求和算法,但得到的结果很差。但如果我们只要求列的总和"A",我们得到了使用成对求和计算的准确求和结果。

总之,在使用这种大小的 DataFrame 时,您需要小心(a)尽可能使用双精度而不是单精度,以及(b)准备好应对由于 NumPy 做出不同算法选择而导致的输出结果差异。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pandas 中的 .sum() 方法给出不一致的结果 的相关文章

  • 如何编译Python 1.0

    出于某种反常的原因 我想尝试Python 1 0 我将如何编译它 或者更确切地说 可以使用当前编译器干净地编译的早期版本是什么 我使用的是 Mac OS X 10 5 不过因为这只是出于好奇 关于语言如何变化 所以在 Linux 虚拟机中编
  • ImportError:尝试在没有已知父包的情况下进行相对导入[重复]

    这个问题在这里已经有答案了 我正在学习使用 python 编程 并且在从包中的模块导入时遇到问题 我正在使用 Visual Studio 代码和 Python 3 8 2 64 位 我的项目目录 https i stack imgur co
  • 通过getattr动态获取dict元素?

    我想动态查询我想要检索的类中的哪些对象 getattr似乎是我想要的 并且它对于类中的顶级对象表现良好 但是 我还想指定子元素 class MyObj object def init self self d a 1 b 2 self c 3
  • 查找其他列表项中列表项的列表索引

    我有一个长字符串列表 我想获取与另一个列表中的字符串子字符串匹配的列表元素的索引 使用列表理解可以轻松检查列表项是否包含列表中的单个字符串 例如这个问题 https stackoverflow com questions 4843158 c
  • Boto3 - 打印 AWS 实例平均 CPU 利用率

    我正在尝试仅打印 AWS 实例的平均 CPU 利用率 此代码将打印出 响应 但最后的 for 循环不会打印平均利用率 有人可以帮忙吗 先感谢您 import boto3 import sys from datetime import dat
  • 对自定义类进行排序而不使用“key”参数?

    您可以对数组进行排序myclass通过使用key论证sorted功能 sortedlist sorted myclasses key lambda obj obj myproperty 有没有办法为我们的班级定义自然顺序 也许有一些神奇的方
  • 如何将 pymongo.cursor.Cursor 转换为字典?

    我正在使用 pymongo 查询一个区域内的所有项目 实际上是查询地图上一个区域内的所有场馆 我用了db command SON 在搜索球形区域之前 它可以返回一本字典 字典中有一个名为results其中包含场馆 现在我需要在一个正方形区域
  • 用户在对话框中输入

    python 中是否有任何库可用于图形用户输入 我知道关于tk但我相信需要一些代码才能做到这一点 我正在寻找最短的解决方案 a input Enter your string here 取而代之的是 我想要一个对话框 以便用户可以在那里输入
  • Python 3 urllib 与请求性能

    我正在使用 python 3 5 并且正在检查 urllib 模块与 requests 模块的性能 我用 python 编写了两个客户端 第一个使用 urllib 模块 第二个使用 request 模块 它们都生成二进制数据 我将其发送到基
  • Python 中的类位于不同的文件中吗?

    与 Java 或 php 非常相似 我习惯将类与文件分开 Python 中也是同样的情况吗 另外 我应该如何命名该文件 像classname py一样小写还是像ClassName py一样 如果我想从此类创建一个对象 我是否需要做一些特殊的
  • Spark MLLib 存在问题,导致概率和预测对于所有内容都相同

    我正在学习如何将机器学习与 Spark MLLib 结合使用 目的是对推文进行情感分析 我从这里得到了一个情感分析数据集 http thinknook com wp content uploads 2012 09 Sentiment Ana
  • 如何加载 caffe 模型并转换为 numpy 数组?

    我有一个 caffemodel 文件 其中包含 ethereon 的 caffe tensorflow 转换实用程序不支持的层 我想生成我的咖啡模型的 numpy 表示 我的问题是 如何将 caffemodel 文件 我还有 prototx
  • pip 安装与本地包具有相同命名空间的包

    我使用的是 Python 3 6 5 通过 miniconda 安装 我的问题是由于我正在安装一个与本地包具有相同命名空间的包 pip 安装此包后 我无法再从本地包导入 我收到一个ModuleNotFoundError错误 如果可能的话 命
  • 如何更新 certifi 的根证书?

    我正在使用 certifi python 模块来验证 ssl 连接 我查看了 certifi python2 7 site packages certifi cacert pem 中包含的根证书 其中一些证书已过期 我如何更新这些证书 我尝
  • python中根据变量类型处理数据子集

    我将以下数据存储在 csv df sample csv 中 我将列名放在名为 cols list 的列表中 df 数据 样本 df data sample pd DataFrame new video BASE SHIVER PREFER
  • Numpy - 两个矩阵的行之间的协方差

    我需要计算两个不同矩阵的每一行之间的协方差 即第一个矩阵的第一行与第二个矩阵的第一行之间的协方差 依此类推 直到两个矩阵的最后一行 我可以在没有 NumPy 的情况下使用下面附加的代码来完成此操作 我的问题是 是否可以避免使用 for 循环
  • 利用“写入时复制”将数据复制到 Multiprocessing.Pool() 工作进程

    我有一点multiprocessingPython 代码看起来有点像这样 import time from multiprocessing import Pool import numpy as np class MyClass objec
  • 类型错误:“State”和“State”实例之间不支持“<” PYTHON 3

    我正在尝试利用队列类中的 PriorityQueue 但是 我在将自定义对象放入 PQ 时遇到问题 我已经实施了 cmp 函数如下 def cmp self other return self priority gt other prior
  • 导入后属性未添加到模块中

    我做了以下实验室 vagrant ubuntu xenial test tree pack1 init py mod1 py pack2 init py mod2 py mod3 py test py 2 directories 6 fil
  • 使用scrapy到json文件只得到一行输出

    好吧 我对一般编程很陌生 并且具体使用 Scrapy 来实现此目的 我编写了一个爬虫来从 pinterest com 上的 pin 获取数据 问题是我以前从我正在抓取的页面上的所有引脚获取数据 但现在我只获取第一个引脚的数据 我认为问题出在

随机推荐

  • 处理器处理中断的速度有多快

    我正在研究中断 因此 大多数架构都是中断驱动的 如果一切都是中断驱动的 那么处理器处理所有这些的速度有多快 例如 当按下键盘按键时 它会创建一个中断 要求内核在缓冲区中查找新字符 在这种情况下 处理器的服务速度有多快 而且当发出中断时 处理
  • 如何使用 .env 文件覆盖 fastlane 应用程序文件中的值

    在某些情况下 我们需要覆盖 fastlane 应用程序文件中的值 例如使用不同的苹果帐户来发布应用程序 但没有记录的官方方法 最简单的方法是使用环境变量 Use an Appfile像这样 apple id ENV APPLE ID ema
  • 如果满足条件则打印上一行

    我想 grep 一个单词 然后找到该行中的第二列并检查它是否大于某个值 是的 我想打印上一行 Ex 输入文件 AAAAAAAAAAAAA BB 2 CCCCCCCCCCCCC BB 0 1 Output AAAAAAAAAAAAA 现在 我
  • 如何创建崩溃时重新启动的服务

    我正在使用创建服务CreateService http msdn microsoft com en us library ms682450 28VS 85 29 aspx 如果该服务发生崩溃 它将再次正常运行 并且我希望 Windows 在
  • 如何从 PHP 获取电子邮件及其附件

    我正在为朋友的婚礼编写一个照片库网络应用程序 他们想要一个照片库供客人提交他们当天拍摄的数码照片 在评估了所有选项后 我决定对用户来说最简单的事情就是让他们使用熟悉的界面 他们的电子邮件 然后让他们将图片作为附件发送 我已经创建了一个邮箱
  • 如何将 WCF 客户端代理生成的类中的方法标记为虚拟

    在 VS 2010 中 我创建了一个服务引用 该引用的代码生成 WCF 客户端代理类 Reference cs 我需要此类中的方法具有 Virtual 修饰符 以便它们可以在 Mock 中使用 当然 我可以手动编辑生成的代码 但每次更新引用
  • 通过 ajax 加载的表单上的 :remote => true/data-remote

    在我的 Rails 应用程序中 我有一个使用 jQuery 加载方法通过 Ajax 加载的表单 function load sales form product id sales form load product id 加载的表单有一个
  • Junit测试时如何将日志级别设置为DEBUG?

    我将 SLF4J 与 LOG4J 一起使用 配置通常位于log4j properties 并将日志级别设置为 INFO 但是在测试期间我想将日志设置为 调试 我看不出有什么方法可以实现自动化 也没有类似的东西log4j tests prop
  • PyOpenCL 矩阵乘法

    我有使用 pyopenCL 进行矩阵乘法的代码 我的问题是某些矩阵的结果是错误的 我不明白为什么 经过一番研究后 我认为它与类似的全球规模有关 但我不明白如何设置该值 例如 使用 numpy dtype float32 的矩阵 矩阵1 0
  • 如何使用 Angular 的装饰器模式来增强指令的链接功能?

    我正在开发一个 Angular 库 并寻找一种使用装饰器模式扩展指令的方法 angular module myApp decorator originaldirectiveDirective delegate function delega
  • Jekyll 右对齐文本

    如何在 Jekyll 中右对齐文本 我有一段文本想要右对齐 如果是 HTML 我会这样做 style text align right 我怎样才能用 Jekyll 在 Markdown 中做到这一点 Jekyll 2 0 使用 kramdo
  • DefaultConnection 和membership - localsqlserver 和defaultconnection 之间的连接是什么

    嗯 我真的无法理解这个问题 在 web config 我有
  • 编译器错误消息:CS0029:无法将类型“int”隐式转换为“string”

    我需要转换String表数据库的输入整数值在 C NET 4 中并尝试了受此启发的代码Link https stackoverflow com questions 2344411 how to convert string to integ
  • 获取 ASP.NET MVC 站点在文件系统中的路径

    我有一个 ASP NET MVC 项目 它有一个名为电子邮件的子文件夹 其中包含我的电子邮件模板的 HTM 文件 在网站的某些位置 我有一个控制器需要加载这些模板之一并将其作为电子邮件发送 我想要做的是使用反射来获取当前执行程序集的路径 但
  • Visual Studio Code 无法在 WSL2 上运行

    当我尝试在 WSL2 终端中打开 VS Code 时 如下所示 code 我收到以下错误 mkdir cannot create directory DIRECTORY Permission denied 当使用 sudo 启动时 sudo
  • 使用 Linq to SQL 进行多线程处理

    我正在构建一个应用程序 它需要我使用 DataContext 的内部线程 我的应用程序不断抛出异常InvalidOperationException类似于 There is already an open DataReader associ
  • 未知长度资产的 AVAssetResourceLoaderDelegate 实现

    我的 iOS 应用程序使用 AVPlayer 播放来自我的服务器的流音频并将其存储在设备上 我实现了 AVAssetResourceLoaderDelegate 因此我可以拦截该流 我改变了我的计划 从http到一个假方案 以便调用 AVA
  • 戳堆栈

    我试图了解堆栈到底是如何工作的 所以我将在这里重新创建一个带有一些问题的小示例 假设我在 ASM 中有一段小代码 它执行以下操作 这一切都是x86 intel语法 Linux push ebp mov ebp esp sub esp 16
  • 通用视图模型?

    我想知道尝试创建一个采用通用视图模型的视图是否是一种好的做法 我想知道这一点 因为有人提到他预计必须执行大量重复代码 除非他开始制作通用视图和通用视图模型 所以基本上视图就像一组控件 一个视图可能有 2 个控件 例如文本框和单选按钮 另一个
  • pandas 中的 .sum() 方法给出不一致的结果

    我有一个大的 DataFrame 大约 4e 07 行 总结时 我得到2 显着不同的结果我是否做总和之前或之后列选择 另外 类型变化从 float32 到 float64 即使总数均低于 2 31 df col1 col2 col3 sum