En pandas, ¿puedo copiar profundamente un DataFrame incluyendo su índice y columna?

Primero, creo un DataFrame

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

Entonces, lo copio profundamente por copy

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

Ahora los DataFrame son diferentes.

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

Sin embargo, el index sigue siendo el mismo.

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

Lo mismo sucede en las columnas, ¿hay alguna forma de que pueda copiarlo profundamente, no solo los valores sino también el índice y las columnas?

La última versión de Pandas ya no tiene este problema

  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) 

Me pregunto si esto es un error en los pandas … es interesante porque se supone que el Index / MultiIndex (índice y columnas) es de algún modo inmutable (sin embargo, creo que deberían ser copias).

Por ahora, es fácil crear su propio método y agregarlo a 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() 

Como puede ver, esto creará nuevos objetos (y conservará los nombres):

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