DateFrame.copy(deep=True)
复制object的索引和数据
- 当deep=True时(默认), 会创建一个新的对象进行拷贝. 修改这份拷贝不会对原有对象产生影响.
- 当deep=False时, 新的对象只是原有对象的references. 任何对新对象的改变都会影响到原有对象
Parameters: deep: bool, default True
Returns: copy: Series, DataFrame or Panel, Object type matches caller
Notes
当deep=True时, 数据会被拷贝, 但是实际的Python对象不会被递归的拷贝, 只有reference指向对象. 这是与标准库中copy.deepcopy
的区别, 其递归的拷贝了object data.
当deep=True且是Index对象被拷贝时, 因为性能的原因位于其下的numpy array不会被拷贝. 由于Index是不可变的, 其下的数据可以被安全的分享, 所以拷贝他们是没必要的.
Python对象不会被递归拷贝的举例
在下面这个例子中存在Python的列表对象, 当s的列表对象的元素更改时, deep的也会跟着改动
In [30]: s = pd.Series([[1, 2],[3, 4]])
In [31]: s
Out[31]:
0 [1, 2]
1 [3, 4]
dtype: object
In [32]: deep = s.copy()
In [34]: s[0][0] = 10
In [35]: s
Out[35]:
0 [10, 2]
1 [3, 4]
dtype: object
In [36]: deep
Out[36]:
0 [10, 2]
1 [3, 4]
dtype: object