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
df2
和 df1
的 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
在这种情况下,原始对象中包含的数据不会递归复制。包含在原始对象数据中的数据仍然指向同一个内存单元。
例如,如果一个系列对象中的数据是可变的,它将在它和它的深层副本之间共享,并且对一个对象的任何更改都将反映在另一个对象中。