在pandas中,我可以深度复制DataFrame,包括其索引和列吗?

wai*_*kuo 25 python pandas

首先,我创建一个DataFrame

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

然后,我深深地复制了它 copy

In [63]: df2 = df.copy(deep=True)
Run Code Online (Sandbox Code Playgroud)

现在DataFrame不同了.

In [64]: id(df), id(df2)
Out[64]: (4385185040, 4385183312)
Run Code Online (Sandbox Code Playgroud)

但是,index仍然是一样的.

In [65]: id(df.index), id(df2.index)
Out[65]: (4385175264, 4385175264)
Run Code Online (Sandbox Code Playgroud)

在列中发生同样的事情,有没有什么方法可以轻松地将其复制到值,还有索引和列?

小智 26

最新版本的熊猫不再有这个问题了

  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)
Run Code Online (Sandbox Code Playgroud)


And*_*den 11

我想知道这是否是熊猫中的一个错误......这很有意思,因为Index/MultiIndex(索引和列)在某种意义上应该是不可变的(但我认为这些应该是副本).

现在,可以轻松创建自己的方法,并将其添加到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()
Run Code Online (Sandbox Code Playgroud)

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

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

In [15]: id(df2.columns)
Out[15]: 4372118776
Run Code Online (Sandbox Code Playgroud)