【问题标题】:In pandas, can I deeply copy a DataFrame including its index and column?在 pandas 中,我可以深度复制包含索引和列的 DataFrame 吗?
【发布时间】:2013-07-11 10:31:56
【问题描述】:

首先,我创建一个 DataFrame

In [61]: import pandas as pd
In [62]: df = pd.DataFrame([[1], [2], [3]])

然后,我深度复制copy

In [63]: df2 = df.copy(deep=True)

现在DataFrame 不同了。

In [64]: id(df), id(df2)
Out[64]: (4385185040, 4385183312)

不过,index 还是一样的。

In [65]: id(df.index), id(df2.index)
Out[65]: (4385175264, 4385175264)

同样的事情发生在列中,有什么方法可以轻松地深度复制它,不仅是值,还包括索引和列?

【问题讨论】:

  • deep=True 是默认值

标签: python pandas


【解决方案1】:

最新版的 Pandas 没有这个问题了

  import pandas as pd
  df = pd.DataFrame([[1], [2], [3]])

  df2 = df.copy(deep=True)

  id(df), id(df2)
  Out[3]: (136575472, 127792400)

  id(df.index), id(df2.index)
  Out[4]: (145820144, 127657008)

【讨论】:

  • @LoremIpsum,您的意思是暗示该错误在 2017 年的那些版本中没有返回吗?谢尔盖 2014 年的回答暗示到那时它已经修复了。如果错误在这些版本的库中重新出现,那么评论可能会更强大!
【解决方案2】:

我想知道这是否是 pandas 中的错误...这很有趣,因为 Index/MultiIndex(索引和列)在某种意义上是 supposed to be immutable(但我认为这些应该是副本)。

现在,创建自己的方法并将其添加到 DataFrame 很容易:

In [11]: def very_deep_copy(self):
    return pd.DataFrame(self.values.copy(), self.index.copy(), self.columns.copy())

In [12]: pd.DataFrame.very_deep_copy = very_deep_copy

In [13]: df2 = df.very_deep_copy()

如您所见,这将创建新对象(并保留名称):

In [14]: id(df.columns)
Out[14]: 4370636624

In [15]: id(df2.columns)
Out[15]: 4372118776

【讨论】:

    猜你喜欢
    • 2017-06-20
    • 2020-09-15
    • 1970-01-01
    • 2018-09-07
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    相关资源
    最近更新 更多