pandas.Series.copy#

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

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

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

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

备注

如上所述的 deep=False 的行为将在 pandas 3.0 中发生更改。Copy-on-Write 将默认启用,这意味着使用 deep=False 返回的“浅”副本仍将避免立即复制,但对原始数据的更改将*不再*反映在浅副本中(反之亦然)。相反,它利用了一种延迟(惰性)复制机制,只有在对原始对象或浅副本进行任何更改时才会复制数据。

通过启用 copy on write pd.options.mode.copy_on_write = True,您可以获得未来的行为和改进。

Parameters:
deepbool, default True

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

Returns:
Series 或 DataFrame

对象类型与调用者匹配。

Notes

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

虽然 deep=True 时会拷贝 Index 对象,但出于性能考虑,底层 NumPy 数组不会被拷贝。由于 Index 是不可变的,底层数据可以安全地共享,无需拷贝。

由于 pandas 不是线程安全的,在多线程环境中进行拷贝时,请参阅 gotchas

当 pandas 配置中的 copy_on_write 设置为 True 时,即使 deep=Falsecopy_on_write 配置也会生效。这意味着对拷贝数据进行的任何更改都会在写入时创建新的数据副本(反之亦然)。对原始变量或已拷贝变量的更改不会反映在另一个变量中。有关更多信息,请参阅 Copy_on_Write

Examples

>>> 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 and s.index is shallow.index
True

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

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

对浅拷贝和原件共享的数据进行的更新会在两者中都得到反映(注意:对于 pandas >= 3.0,此行为将不再成立);深拷贝保持不变。

>>> s.iloc[0] = 3
>>> shallow.iloc[1] = 4
>>> s
a    3
b    4
dtype: int64
>>> shallow
a    3
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

当 Copy-on-Write 设置为 True 时,修改原件数据时,浅拷贝不会被修改:

>>> with pd.option_context("mode.copy_on_write", True):
...     s = pd.Series([1, 2], index=["a", "b"])
...     copy = s.copy(deep=False)
...     s.iloc[0] = 100
...     s
a    100
b      2
dtype: int64
>>> copy
a    1
b    2
dtype: int64