First, I create a DataFrame
In [61]: import pandas as pd
In [62]: df = pd.DataFrame([[1], [2], [3]])
Then, I deeply copy it by copy
Latest version of Pandas does not have this issue anymore
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)
I wonder whether this is a bug in pandas... it's interesting because Index/MultiIndex (index and columns) are in some sense supposed to be immutable (however I think these should be copies).
For now, it's easy to create your own method, and add it to 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()
As you can see this will create new objects (and preserve names):
In [14]: id(df.columns)
Out[14]: 4370636624
In [15]: id(df2.columns)
Out[15]: 4372118776