为什么 Pandas 没有就地操作?

Pandas 操作通常会创建原始数据帧的副本。 As some answers on SO point out ,即使使用 inplace=True ,很多操作仍然会创建一个副本来操作。

现在,如果我告诉我的同事每次我想将 +2 应用于列表时,我想我会被称为疯子,我会在执行之前复制整个内容。然而,这就是 Pandas 所做的。即使是简单的操作,例如追加 always reallocate the whole dataframe

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

此外,对于 Pandas 开发人员或用户来说,这似乎不是问题,以至于有一个 open issue #16529 discussing the removal of the inplace parameter entirely 得到了大部分积极的回应;有些从 1.0 开始被弃用。好像我错过了什么。那么,我错过了什么?

总是在操作中复制数据帧而不是尽可能就地执行它们有什么好处?

Note: I agree that method chaining is very neat, I use it all the time. However, I feel that "because we can method chain" is not the whole answer, since Pandas sometimes copies even in 就地=真 methods, which are not meant to be chained. So, I'm looking some other answers for why this would be a reasonable default.

stack overflow Why aren't Pandas operations in-place?
原文答案

答案:

作者头像

正如pandas文档中证明的 here 所证明的 "... In general we like to favor immutability where sensible." pandas项目在偏爱不变的(无状态)对象而不是可变的对象(具有状态的对象)的营地中,以指导程序员创建更可扩展 /可行的可行数据处理代码。他们通过使“ Inplace = false”行为成为默认值来指导用户。

在这个软件工程堆栈交换中,Peter Torok非常很好地讨论了可变的对象编程之间的利弊。 https://softwareengineering.stackexchange.com/a/151735

总而言之,一些软件工程师认为不变的物体(不变)导致

代码中的错误更少 - 因为对象状态很容易失去跟踪,并且很难追踪
提高可伸缩性 - 编写多线程代码更容易,因为一个线程不会无意中修改对象中包含的值
*更简洁的代码 - 由于代码被迫用功能编程和更多的数学样式编写

我会同意,这确实是效率低下的,因为不断地制作相同对象进行小变化的副本似乎并不理想。它还有上面提到的其他好处。