pandas.DataFrame.copy #
- 数据框。复制( deep = True ) [来源] #
复制该对象的索引和数据。
当
deep=True
(默认)时,将使用调用对象的数据和索引的副本创建一个新对象。对副本数据或索引的修改不会反映在原始对象中(请参阅下面的注释)。当 时
deep=False
,将创建一个新对象,而不复制调用对象的数据或索引(仅复制对数据和索引的引用)。对原始数据的任何更改都将反映在浅拷贝中(反之亦然)。笔记
deep=False
上述行为将在 pandas 3.0 中发生变化。默认情况下将启用写入时复制 ,这意味着返回的“浅”副本deep=False
仍将避免进行急切复制,但对原始数据的更改将不再 反映在浅复制中(或相反亦然)。相反,它使用惰性(延迟)复制机制,仅当对原始副本或浅副本进行任何更改时才会复制数据。您已经可以通过启用写入时复制来获得未来的行为和改进
pd.options.mode.copy_on_write = True
- 参数:
- 深布尔值,默认 True
制作深层副本,包括数据和索引的副本。索引
deep=False
和数据都不会被复制。
- 返回:
- 系列或数据框
对象类型与调用者匹配。
笔记
当 时
deep=True
,数据被复制,但实际的 Python 对象不会被递归复制,只会复制对象的引用。这与标准库中的copy.deepcopy形成对比,后者递归地复制对象数据(请参见下面的示例)。当
Index
时 复制对象时deep=True
,出于性能原因,不会复制底层 numpy 数组。由于Index
是不可变的,因此可以安全地共享底层数据并且不需要副本。由于 pandas 不是线程安全的,因此请参阅 在线程环境中复制时的陷阱。
当
copy_on_write
pandas config 设置为时True
,copy_on_write
即使在deep=False
.这意味着对复制数据的任何更改都会在写入时创建数据的新副本(反之亦然)。对原始变量或复制变量所做的更改不会反映在对应变量中。有关详细信息,请参阅写入时复制。例子
>>> 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