Pandas DataFrame 中浅拷贝与深拷贝的区别

Luqman Khan 2022年5月16日
Pandas DataFrame 中浅拷贝与深拷贝的区别

本教程文章将介绍 Pandas Dataframe 中浅拷贝和深拷贝的区别。

当我们想要添加、删除或更新 DataFrame 时,我们可以复制并执行操作,而无需修改 DataFrame。

Pandas Dataframes 中浅拷贝和深拷贝的区别

Pandas Dataframes 中的浅拷贝和深拷贝有很多不同之处。本文将提供其中两个差异。

你可以在下面看到用于 Python Pandas Dataframe.copy() 函数的语法。

DataFrame.copy(deep=True)

Deep 表示布尔值(True 或 False),默认为 True。Pandas 的数据结构浅拷贝和深拷贝有两种方式。首先,我们讨论浅拷贝。

在 Pandas DataFrame 中创建浅拷贝比创建深拷贝更快

Deep=False 不会复制原始对象的索引或数据。使用 df.copy(deep=False) 方法制作 Pandas DataFrame 的浅表副本。

它指的是创建一个新的集合对象,然后使用对原始子对象的引用来填充它。因为复制操作不递归,所以不会创建子对象的副本。

与深拷贝相反,创建浅拷贝更快。

pandas.DataFrame.copy(deep=False)

为此目的导入 Python Pandas 库。

import pandas as pd

导入 Pandas 库后,分配一个 DataFrame。

df = pd.DataFrame([5, 6, 7, 8, 9])
print(df)

输出:

   0
0  5
1  6
2  7
3  8
4  9

现在使用 id 看看会发生什么。

>>> id(df1)

输出:

140509987701904

创建变量 df2 并存储 df1 并查看 df2 的 ID。

>>> df2 = df1
>>> id(df2)

输出:

140509987701904

df2df1 的 id 相同。现在,使用复制功能查看 id 是否更改。

>>> df3 = df1.copy()
>>> id(df3)

查看下面的输出以查看更改。

输出:

140509924069968

浅拷贝:

>>> df4 = df1.copy(deep=False)
>>> print(df4)
>>> id(df4)

输出:

   0
0   6
1   7
2   8
3   9
4  10
140509923248976

深拷贝:

Deep=True(默认值),使用调用对象的数据和索引的副本生成一个新对象。对副本数据或索引的更改不会反映原始对象。

使用 df.copy(deep=False) 方法制作 Pandas Dataframe 的浅表副本。一个对象的副本被复制到深拷贝中的另一个对象中。

它表示对对象副本所做的任何修改都不会反映在原始对象中。创建深层副本比创建浅层副本需要更长的时间。

>>> df4 = df1.copy(deep=True)
>>> print(df4)
>>> id(df4)

输出:

    0
0   6
1   7
2   8
3   9
4  10
140509923248720

两个 id 都不一样。我们再举一个例子,看看浅拷贝和深拷贝的区别。

浅拷贝依赖于原件

import pandas as pd

df = pd.DataFrame({"in": [1, 2, 3, 4], "Maria": ["Man", "kon", "nerti", "Ba"]})
copydf = df.copy(deep=False)
print("\nBefore Operation:\n", copydf == df)
copydf["in"] = [0, 0, 0, 0]
print("\nAfter Operation:\n", copydf == df)
print("\nAfter operation original dataframe:\n", df)

输出:

Before Operation:
      in  Maria
0  True   True
1  True   True
2  True   True
3  True   True

After Operation:
      in  Maria
0  True   True
1  True   True
2  True   True
3  True   True

After operation original dataframe:
    in  Maria
0   0    Man
1   0    kon
2   0  nerti
3   0     Ba

正如前面程序的输出所示,对浅拷贝 DataFrame 所做的修改会自动应用于原始序列。现在使用相同的代码;更改深层副本的 deep=True

深拷贝不完全依赖于原始

import pandas as pd

df = pd.DataFrame({"in": [1, 2, 3, 4], "Maria": ["Man", "kon", "nerti", "Ba"]})
copydf = df.copy(deep=True)
print("\nBefore Operation:\n", copydf == df)
copydf["in"] = [0, 0, 0, 0]
print("\nAfter Operation:\n", copydf == df)
print("\nAfter operation original dataframe:\n", df)

输出:

Before Operation:
      in  Maria
0  True   True
1  True   True
2  True   True
3  True   True

After Operation:
       in  Maria
0  False   True
1  False   True
2  False   True
3  False   True

After operation original dataframe:
    in  Maria
0   1    Man
1   2    kon
2   3  nerti
3   4     Ba

在这种情况下,原始对象中包含的数据不会递归复制。包含在原始对象数据中的数据仍然指向同一个内存单元。

例如,如果一个系列对象中的数据是可变的,它将在它和它的深层副本之间共享,并且对一个对象的任何更改都将反映在另一个对象中。

相关文章 - Pandas DataFrame