pandas.DataFrame.copy#

DataFrame.copy(deep=True)[源代码]#

制作此对象索引和数据的副本。

deep=True(默认)时,将创建一个新对象,其中包含调用对象的数据和索引的副本。修改副本的数据或索引不会反映在原始对象中(请参阅下面的注释)。

deep=False 时,将创建一个新对象,但不复制调用对象的数据或索引(仅复制数据和索引的引用)。使用写时复制 (Copy-on-Write),对原始对象的更改不会反映在浅副本中(反之亦然)。浅副本使用惰性(延迟)复制机制,仅在对原始对象或浅副本进行任何更改时才复制数据,从而确保内存效率同时保持数据完整性。

注意

在 pandas 3.0 之前的版本中,不使用写时复制时的默认行为有所不同:对原始对象的更改确实会反映在浅副本中(反之亦然)。有关更多信息,请参阅 写时复制用户指南

参数:
deepbool, 默认 True

执行深拷贝,包括数据和索引的拷贝。当 deep=False 时,索引和数据都不会被复制。

返回:
Series 或 DataFrame

对象类型与调用者匹配。

另请参阅

copy.copy

返回对象的浅拷贝。

copy.deepcopy

返回对象的深拷贝。

注意

deep=True 时,数据会被复制,但实际的 Python 对象不会被递归复制,只会复制对对象的引用。这与标准库中的 copy.deepcopy 不同,后者会递归地复制对象数据(请参阅下面的示例)。

deep=True 时,Index 对象会被复制,但底层 numpy 数组不会被复制,以提高性能。由于 Index 是不可变的,底层数据可以安全地共享,因此不需要复制。

由于 pandas 不是线程安全的,请参阅 陷阱 中关于在多线程环境中复制的注意事项。

写时复制 (Copy-on-Write) 可保护浅副本免受意外修改。这意味着对复制数据的任何更改都会在写入时创建一个新的数据副本(反之亦然)。对原始变量或复制变量所做的更改不会反映在另一方。有关更多信息,请参阅 Copy_on_Write

示例

>>> s = pd.Series([1, 2], index=["a", "b"])
>>> s
a    1
b    2
dtype: int64
>>> s_copy = s.copy(deep=True)
>>> s_copy
a    1
b    2
dtype: int64

由于写时复制 (Copy-on-Write),浅副本仍然可以防止数据修改。请注意,下面的浅副本不会被修改。

>>> s = pd.Series([1, 2], index=["a", "b"])
>>> shallow = s.copy(deep=False)
>>> s.iloc[1] = 200
>>> shallow
a    1
b    2
dtype: int64

当数据是 object 类型时,即使是深拷贝也不会复制底层的 Python 对象。更新嵌套的数据对象仍然会在深拷贝中反映出来。

>>> s = pd.Series([[1, 2], [3, 4]])
>>> deep = s.copy()
>>> s[0][0] = 10
>>> s
0    [10, 2]
1     [3, 4]
dtype: object
>>> deep
0    [10, 2]
1     [3, 4]
dtype: object