【问题标题】:How copy method works in pandas dataframe?复制方法如何在熊猫数据框中工作?
【发布时间】:2022-01-17 08:55:04
【问题描述】:
当我在 pandas 数据框中有 dg = df.copy() 时,我知道我有两个数据框,其中 dg 是 df 的副本。但是对于df = df.copy(),新的df会覆盖旧的df吗?我的意思是在 df = df.copy() 的 RAM 中我有多少数据帧?
【问题讨论】:
标签:
python
pandas
dataframe
copy
【解决方案1】:
来自熊猫官方documentation
DataFrame.copy(deep=True)
复制此对象的索引
和数据。
当deep=True(默认)时,将创建一个新对象,其中包含
调用对象的数据和索引。修改数据或
副本的索引不会反映在原始对象中(请参阅
以下注释)。
deep=False 时,将创建一个新对象,而不复制
调用对象的数据或索引(仅引用数据和索引
被复制)。对原始数据的任何更改都将反映
在浅拷贝中(反之亦然)。
因此,当您拥有df = df.copy() 时,您只是将df 对象分配给df 变量名,因此功能上没有任何变化。它被覆盖,但保持不变。所以你仍然只有一个 df 对象存储在内存中。
【解决方案2】:
但是对于 df = df.copy(),新的 df 会覆盖旧的 df 吗?我的意思是在内存中 df = df.copy() 我有多少数据帧?
这不是关于 Pandas 或 DataFrame 类的问题。这是一个关于Python中=操作符的问题。
df.copy() 创建一个新对象,它恰好是 DataFrame 类的一个新实例。这就是你必须知道的。 (你必须知道这一点,因为函数可以返回已经存在的对象。)无论你写 dg = df.copy() 还是 df = df.copy(),它都会这样做完全相同 - 这可能无关紧要,因为该方法无法知道分配甚至会发生。
分配causes a name to refer to some particular object。就是它。 dg = df.copy() 的意思是“当你从df.copy() 取回对象时,让dg 成为该对象的名称”。 df = df.copy() 的意思是“当你从df.copy() 取回对象时,让df(不再是它之前命名的名称,而是)成为那个对象的名称”。
只要有名称,对象就会一直存在。
当你写dg = df.copy() 时,df 名称仍然是原始DataFrame 的名称,所以现在你的内存中必然有两个DataFrames。
当您编写df = df.copy() 时,df 名称不再是原来 DataFrame 的名称,因为它已更改为新名称的名称。所以现在旧的可能会或可能不会仍然在记忆中。
如果它有任何 other 名称(或其他引用 - 例如,作为某个列表的元素),它肯定仍会在内存中。
在参考实现中,如果这是对象的最后一个剩余名称,它将被释放。发生这种情况是因为参考实现使用了基于引用计数的垃圾收集。其他实现(例如,Jython)可能不会这样做;他们可以使用任何类型的垃圾收集技术。