在 Pandas DataFrame 子集(副本)上设置值很慢

2024-01-03

import timeit
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.rand(10, 10))

dft = df[[True, False] * 5]
# df = dft
dft2 = dft.copy()

new_data = np.random.rand(5, 10)

print(timeit.timeit('dft.loc[:, :] = new_data', setup='from __main__ import dft, new_data', number=100))
print(timeit.timeit('dft2.loc[:, :] = new_data', setup='from __main__ import dft2, new_data', number=100))

在我的笔记本电脑上设置值dft(原始子集)比设置值慢大约 160 倍dft2(深拷贝dft).

为什么会这样呢?

Edit:删除了有关代理对象的猜测。

作为c。 Leather 表明,这可能是因为在副本上设置值时使用了不同的代码路径(dft) 与原始数据框 (dft2).

额外问题:删除对原始 DataFrame 的引用df(通过取消注释df = dft线),在我的笔记本电脑上将速度系数降低到大约 2。知道为什么会这样吗?


这不完全是一个新问题。This https://stackoverflow.com/questions/22532302/pandas-peculiar-performance-drop-for-inplace-rename-after-dropna, and this https://stackoverflow.com/questions/17960511/pandas-subindexing-dataframes-copies-vs-views是相关帖子。这是当前文档的链接 http://pandas-docs.github.io/pandas-docs-travis/indexing.html?highlight=view#indexing-view-versus-copy这就解释了这一点。

@c.leather 的评论是正确的。问题是dft是一个视图,而不是数据框的副本df,如链接文章中所述。但是 pandas 无法知道它是否真的是副本以及操作是否安全,因此需要进行大量检查以确保执行分配是安全的,而这可以通过简单地避免复印。

这是一个相关问题,在Github https://github.com/pydata/pandas/issues/10954。我看到了很多建议,我最喜欢的一个是文档应该鼓励df[[True,False] * 5].copy()习语,我们可以将其称为“切片和复制”习语。

我找不到确切的检查,并且在 github 问题上,仅通过一些开发人员发布的一些推文提到了这种性能细微差别,指出了这种行为。也许更多参与 pandas 开发的人可以添加更多的意见。

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

在 Pandas DataFrame 子集(副本)上设置值很慢 的相关文章

随机推荐

  • 实体框架返回与数据库查询不同的数据

    我可以查看数据库中的某些数据 它会返回我期望的数据 例如 Call Date To From Phone Number 20 1 2010 00 00 23 59 08923233223 20 1 2010 00 00 23 59 0892
  • 通过电子邮件和密码使用 firebase 注册用户?

    我使用 Firebase 授权创建了注册活动 并尝试注册新用户 但是当我按下注册按钮时 我的代码出现异常 protected void onCreate Bundle savedInstanceState super onCreate sa
  • 在Java中,有没有办法指定一个参数实现两个接口

    我很想做这样的代码 使用 jGraphT interface DirectedGraph
  • IIS Express 不保留会话数据

    我有一个在 IIS Express 服务器下的 Visual Studio 2013 中运行的应用程序 问题是会话数据没有保留在页面之间 并且我发现之前的页面不为空的空对象 如果我编译该应用程序并将其部署在带有 IIS 的 Web 服务器上
  • Meteor js 和多人游戏

    我开始学习 Meteor 我意识到它可能是简单多人游戏的良好解决方案 因为它的反应性 客户端 minimongo 数据库 客户端之间的实时交换是否足够快以交换玩家坐标 或者这是一个糟糕的解决方案 我应该在没有中间数据库的情况下完成它 只需直
  • MySQL 存储函数的正确 if 子句语法是什么?

    我是 MySQL 的新手 所以如果其中一些内容相对初级 我深表歉意 我正在尝试编写一个存储函数来将数字四舍五入到一定数量的有效数字 我有一个理论上应该可以工作的函数 我咨询了另一个有用的 StackOverflow 来确定逻辑 SQL 中四
  • 什么情况下使用八进制?

    我经常看到二进制和十六进制使用 但从未见过八进制 然而 八进制在某些语言中使用时有其自己的约定 即 前导 0 表示八进制基数 什么时候使用八进制 当人们使用八进制或八进制更容易推理时 有哪些典型情况 或者这只是一个品味问题 当一个字中的位数
  • 多对多关系中的删除不对称?

    我有两个模型 产品和类别 以及一个用于多对多关系的连接表 类别 假设我有两个对象 产品和类别 它们是上述对象的实例 products Product new category Category new product categories
  • 校验和与“git svn clone”不匹配后如何恢复?

    作为我们迁移计划的一部分 我正在将 SVN 存储库克隆到 git 我一路上遇到了各种障碍 迫使我继续克隆git svn fetch命令 最近的失败我不知道如何解决 git svn fetch Checksum mismatch dc tru
  • UIScrollView不滚动

    我有一个 UIScrollView 根本不滚动 如果我启用弹跳 我可以滚动到足够远的距离以查看视图之外的内容 但当我释放时它会立即回到原点 我已打开寻呼 但如果将其关闭 则会出现相同的行为 我已关闭自动布局 在 IB 中 scrollVie
  • 在 JavaScript 中检查字符串是否包含数组的任何元素

    如何检查字符串是否包含数组的任何元素 如果元素有一些字符串 我想过滤一些数组 请看下面的代码 var arr banana monkey banana apple kiwi orange function checker value var
  • Angular / Electron 未启动

    我使用 Angular CLI 创建了 Angular 10 项目 接下来 我安装了 Electron 并完成了以下操作 将 src index html 基础更改为本地安装的 Electron 但是当运行我的代码时 它显示有一些错误 我该
  • Angular 动态 formControlName 使用 fromGroup 生成

    我创建了一个由 JSON 数组组成的表单 根据该表单 我生成 Validation formControlName 并通过 formGroup 生成输出 this ELEMENT DATA UPDATE first name abc las
  • 警告:发生 HTML 1300 导航?

    我已加载我的网站微软边缘版本 25 10586 0 0 和智能屏幕告诉我该网站可能是假的 此警告是该网站上的新警告 控制台日志显示 HTML1300 Navigation occured example com example com 是我
  • 如何调试在 Windows CE 6 的 .NET CF 3.5 WinForms 应用程序中调用 Application.Exit() 后发生的致命错误?

    我正在将 NET CF 1 0 WinForms 应用程序 适用于旧版本的 Windows CE 移植到 NET CF 3 5 适用于 Windows CE 6 问题是 在调用 Application Exit 几秒钟后 我会看到一个 致命
  • 如何在打字稿中使用 sinon 来存根 Express 中间件?

    我正在尝试使用 typescript mocha sinon 和 chai http 为我的 Express 路由器编写集成测试 该路由器使用我编写的自定义中间件 用于检查标头中的 JWT 理想情况下 我想存根我的authMiddlewar
  • Google Mirror API 抛出 BadStatusLine 异常 (Python)

    使用 Mirror API 时 我从多个 API 调用中随机获得 BadStatusLine 异常 包括timeline insert and timeline list 通过在Python中寻找类似的问题 我怀疑这是来自服务器的某种格式错
  • mysqli_fetch_assoc(在 PDO fetch_assoc 中)将数字存储为字符串

    像往常一样 我尽了职责到处寻找太阳 但一无所获 mysqli fetch assoc 显然 将我的数字存储为字符串 通常情况下 我不太关心 但我的网站几乎 100 ajax 并且它移动大量数据 因此所有这些 json 开始累加 如果我只是获
  • Linq:整数之和

    我正进入 状态 不能将 null 值分配给 System Int32 类型的成员 该类型是不可为 null 的值类型 当执行我的空语句的 Sum 时 ResultView 工作正常 但是 var r from v in DataContex
  • 在 Pandas DataFrame 子集(副本)上设置值很慢

    import timeit import pandas as pd import numpy as np df pd DataFrame np random rand 10 10 dft df True False 5 df dft dft