为什么 Pandas 操作没有到位?

Lui*_*ins 34 python in-place pandas

Pandas 操作通常会创建原始数据帧的副本。正如 SO 上的一些答案指出的那样,即使在使用时inplace=True,许多操作仍然会创建一个副本来进行操作。

现在,如果我告诉我的同事,每次我想要申请+2一个列表时,我都会在做之前复制整个内容,我想我会被称为疯子。然而,这就是 Pandas 所做的。即使是简单的操作(例如追加)也会重新分配整个数据帧

必须在每个操作中重新分配和复制所有内容似乎是对任何数据进行操作的非常低效的方法。它还使得无法对特别大的数据帧进行操作,即使它们适合您的 RAM。

此外,这对于 Pandas 开发者或用户来说似乎不是问题,以至于有一个开放的问题 #16529 讨论完全删除该inplace参数,该问题得到了大部分积极的回应;有些从 1.0 开始就被弃用了。好像我错过了一些东西。那么,我错过了什么?

始终在操作上复制数据帧而不是尽可能就地执行它们有什么优点?

注意:我同意方法链接非常简洁,我一直使用它。然而,我觉得“因为我们可以方法链”并不是完整的答案,因为 Pandas 有时甚至在inplace=True方法中进行复制,而这些方法并不意味着被链接。因此,我正在寻找其他一些答案来了解为什么这是一个合理的默认值。

lan*_*ane 9

正如pandas 文档中所证明的那样, “......一般来说,我们喜欢在合理的情况下支持不变性。” Pandas 项目倾向于使用不可变(无状态)对象而不是可变(有状态的对象)来引导程序员创建更具可扩展性/可并行化的数据处理代码。他们通过将“inplace=False”行为设置为默认行为来指导用户。

在这个软件工程堆栈交流中,Peter Torok 很好地讨论了可变对象编程和不可变对象编程之间的优缺点。 https://softwareengineering.stackexchange.com/a/151735

总之,一些软件工程师认为不可变(不变)的对象会导致

  • 代码中的错误更少 - 因为对象状态很容易丢失且难以追踪
  • 提高可扩展性 - 编写多线程代码更容易,因为一个线程不会无意中修改另一个线程中的对象包含的值
  • 更简洁的代码 - 因为代码被迫以函数式编程和更数学的风格编写

我同意这确实效率低下,因为不断地复制相同对象以进行微小的更改似乎并不理想。它还有上述其他好处。