pandas.DataFrame.copy#

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

复制此对象的索引和数据。

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

deep=False 时,将创建一个新对象,而不复制调用对象的数据或索引(仅复制数据和索引的引用)。对原始数据所做的任何更改都将反映在浅拷贝中(反之亦然)。

备注

在 pandas 3.0 中,如上所述的 deep=False 行为将会改变。写时复制 将会默认启用,这意味着即使使用 deep=False 返回的“浅”拷贝仍然会避免立即复制,但原始数据的变化将*不再*反映在浅拷贝中(反之亦然)。相反,它利用了一种懒惰(延迟)的复制机制,只有在原始数据或浅拷贝发生变化时才会复制数据。

通过启用写时复制 pd.options.mode.copy_on_write = True,您已经可以获得未来的行为和改进。

参数:
bool, 默认为 True

进行深度复制,包括数据和索引的复制。使用 deep=False 时,索引和数据都不会被复制。

返回:
Series 或 DataFrame

对象类型匹配调用者。

参见

copy.copy

返回对象的浅拷贝。

copy.deepcopy

返回对象的深层副本。

备注

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

虽然当 deep=TrueIndex 对象会被复制,但由于性能原因,底层 numpy 数组不会被复制。由于 Index 是不可变的,底层数据可以安全地共享,不需要复制。

由于 pandas 不是线程安全的,请在多线程环境中复制时查看 陷阱

写时复制保护浅拷贝免受意外修改。这意味着对复制数据的任何更改都会在写入时创建数据的新副本(反之亦然)。对原始变量或复制变量的更改不会反映在对方身上。更多信息请参见 Copy_on_Write

示例

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

浅拷贝与默认(深)拷贝:

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

浅拷贝与原始对象共享索引,数据是原始数据的视图。

>>> s is shallow
False
>>> s.values is shallow.values
False
>>> s.index is shallow.index
False

深拷贝有自己的数据和索引副本。

>>> s is deep
False
>>> s.values is deep.values or s.index is deep.index
False

浅拷贝也受到保护,不会更新原始对象。因此,更新将仅在一个对象中反映。

>>> s.iloc[0] = 3
>>> shallow.iloc[1] = 4
>>> s
a    3
b    2
dtype: int64
>>> shallow
a    1
b    4
dtype: int64
>>> deep
a    1
b    2
dtype: int64

请注意,当复制包含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