看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
pandas
的 copy
方法用于创建对象的副本。它可以用于 DataFrame 和 Series,以防止对原始数据进行不必要的更改或破坏。
DataFrame
Series
对于 DataFrame 和 Series,语法如下:
DataFrame.copy(deep=True)
Series.copy(deep=True)
deep
(bool, 默认 True
): 如果为 True
,则创建对象的深拷贝;如果为 False
,则创建对象的浅拷贝。返回一个与原始对象相同类型的副本。
当 deep=True
时,数据会被复制,但实际的 Python 对象不会被递归复制,仅会复制对象的引用。这与标准库中的 copy.deepcopy
形成对比,后者会递归复制对象数据(见下例)。
虽然在 deep=True
时 Index 对象会被复制,但出于性能原因,底层的 numpy 数组不会被复制。由于 Index 是不可变的,底层数据可以安全共享,不需要复制。
由于 pandas 不是线程安全的,请注意在线程环境中复制时的注意事项。
当 pandas 配置中的 copy_on_write
设置为 True 时,即使 deep=False
,copy_on_write
配置也会生效。这意味着对复制数据的任何更改都会在写入时生成数据的新副本(反之亦然)。对原始变量或复制变量所做的更改不会反映在对方中。有关详细信息,请参阅 Copy_on_Write。( https://pandas.pydata.org/docs/user_guide/copy_on_write.html#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 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
通过这些示例,我们可以看到 copy
方法在处理不同类型和规模的数据时的应用。它能够帮助我们在需要创建数据副本的情况下选择适当的拷贝方式(深拷贝或浅拷贝),以便在数据处理和分析过程中更好地管理和保护数据。
更新时间:2024-08-05 16:38:52 标签:pandas python copy 副本