【问题标题】: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)可能不会这样做;他们可以使用任何类型的垃圾收集技术。

    【讨论】:

      猜你喜欢
      • 2021-09-06
      • 1970-01-01
      • 1970-01-01
      • 2022-12-16
      • 1970-01-01
      • 1970-01-01
      • 2022-07-20
      • 2021-08-27
      • 2021-04-26
      相关资源
      最近更新 更多