📜  Pandas 数据帧中浅拷贝与深拷贝的区别

📅  最后修改于: 2021-09-12 11:29:40             🧑  作者: Mango

pandas 库主要有 DataFrames 和 Series 两种数据结构。这些数据结构在内部用索引数组表示,索引数组标记数据,数据数组包含实际数据。现在,当我们尝试复制这些数据结构(DataFrames 和 Series)时,我们实际上复制了对象的索引和数据,有两种方法可以做到,即浅复制和深复制。

这些操作是在 DataFrames 和 Series 中用于浅拷贝的库函数 pandas.DataFrame.copy(deep=False)和用于深拷贝的 pandas.DataFrame.copy(deep=True)的帮助下完成的。

现在,让我们了解什么是浅拷贝。

浅拷贝

创建 DataFrame 或 Series 对象的浅表副本时,它不会复制原始对象的索引和数据,而只是复制对其索引和数据的引用。因此,对一个所做的更改会反映在另一个中。

它指的是构造一个新的集合对象,然后使用对原始集合中找到的子对象的引用来填充它。复制过程不会递归,因此不会创建子对象本身的副本。
例子:

Python3
# porgam to depict shallow copy
# in pandas dataframe
  
# import module
import pandas as pd
  
# assign dataframe
df = pd.DataFrame({'index': [1, 2, 3, 4],
                   'GFG': ['Mandy', 'Ron', 'Jacob', 'Bayek']})
  
  
# shallow copy
copydf = df.copy(deep=False)
  
# comparing shallow copied datframe
# and original dataframe
print('\nBefore Operation:\n', copydf == df)
  
# assignmnet operation
copydf['index'] = [0, 0, 0, 0]
  
  
# comparing shallow copied datframe
# and original dataframe
print('\nAfter Operation:\n', copydf == df)
  
print('\nOriginal Dataframe after operation:\n', df)


Python3
# porgam to depict deep copy
# in pandas dataframe
  
# import module
import pandas as pd
  
# assign dataframe
df = pd.DataFrame({'index': [1, 2, 3, 4],
                   'GFG': ['Mandy', 'Ron', 'Jacob', 'Bayek']})
  
# deep copy
copydf = df.copy(deep=True)
  
# comparing shallow copied datframe
# and original dataframe
print('\nBefore Operation:\n', copydf == df)
  
# assignmnet operation
copydf['index'] = [0, 0, 0, 0]
  
  
# comparing shallow copied datframe
# and original dataframe
print('\nAfter Operation:\n', copydf == df)
  
print('\nOriginal Dataframe after operation:\n', df)


输出:

从上述程序的输出中可以看出,应用于浅复制数据帧的更改会自动应用于原始数据帧。

深拷贝

DataFrame 或 Series 对象的深层副本有自己的索引和数据副本。这是一个复制过程递归发生的过程。这意味着首先构造一个新的集合对象,然后用在原始对象中找到的子对象的副本递归地填充它。在深拷贝的情况下,一个对象的副本被复制到另一个对象中。这意味着对对象副本所做的任何更改都不会反映在原始对象中。

例子:

蟒蛇3

# porgam to depict deep copy
# in pandas dataframe
  
# import module
import pandas as pd
  
# assign dataframe
df = pd.DataFrame({'index': [1, 2, 3, 4],
                   'GFG': ['Mandy', 'Ron', 'Jacob', 'Bayek']})
  
# deep copy
copydf = df.copy(deep=True)
  
# comparing shallow copied datframe
# and original dataframe
print('\nBefore Operation:\n', copydf == df)
  
# assignmnet operation
copydf['index'] = [0, 0, 0, 0]
  
  
# comparing shallow copied datframe
# and original dataframe
print('\nAfter Operation:\n', copydf == df)
  
print('\nOriginal Dataframe after operation:\n', df)

输出:

在这里,原始对象内部的数据不会被递归复制。即原始对象的数据里面的数据仍然指向同一个内存单元。例如,如果 Dataframe 或 Series 对象中的数据包含任何可变数据,那么它将在它和它的深层副本之间共享,并且对一个的任何修改都将反映在另一个中。

浅拷贝 V/S 深拷贝区别表

Sr no. Shallow Copy Deep Copy
1 It is the copy of the collection structure, not the elements. It is the copy of the collections with all the elements in the original collection duplicated.
2 Affects the initial dataframe. Does not affect the initial dataframe.
3 Shallow copy doesn’t replicate child objects. Deep copy replicates child objects recursively.
4 Creating a shallow copy is fast as compared to deep copy. Creating a deep copy is slow as compare to shallow copy.
5 The copy is dependent on the original The copy is not fully dependent on the original.