pandas庫主要有兩種數(shù)據(jù)結(jié)構(gòu)DataFrames和Series。這些數(shù)據(jù)結(jié)構(gòu)在內(nèi)部用索引數(shù)組和數(shù)據(jù)數(shù)組表示,索引數(shù)組標(biāo)記數(shù)據(jù),數(shù)據(jù)數(shù)組包含實際數(shù)據(jù)。現(xiàn)在,當(dāng)我們試圖復(fù)制這些數(shù)據(jù)結(jié)構(gòu)(DataFrames和Series)時,我們實際上是復(fù)制對象的索引和數(shù)據(jù),有兩種方法可以做到這一點,即淺復(fù)制和深復(fù)制。
這些操作是在庫函數(shù)pandas.DataFrame.copy(deep=False)(用于淺拷貝)和pandas.DataFrame.copy(deep=True)(用于DataFrames和Series中的深拷貝)的幫助下完成的。
現(xiàn)在,讓我們了解一下什么是淺拷貝。
淺拷貝
當(dāng)創(chuàng)建DataFrame或Series對象的淺層副本時,它不會復(fù)制原始對象的索引和數(shù)據(jù),而只是復(fù)制對其索引和數(shù)據(jù)的引用。因此,對一個對象所做的更改將反映在另一個對象中。
它指的是構(gòu)造一個新的集合對象,然后用對原始集合中的子對象的引用填充它。復(fù)制過程不會遞歸,因此不會創(chuàng)建子對象本身的副本。
比如:
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 dataframe
# and original dataframe
print('\nBefore Operation:\n', copydf == df)
# assignment operation
copydf['index'] = [0, 0, 0, 0]
# comparing shallow copied dataframe
# and original dataframe
print('\nAfter Operation:\n', copydf == df)
print('\nOriginal Dataframe after operation:\n', df)
輸出
從上面程序的輸出可以看出,應(yīng)用于淺層復(fù)制數(shù)據(jù)幀的更改會自動應(yīng)用于原始數(shù)據(jù)幀。
深拷貝
DataFrame或Series對象的深層副本具有自己的索引和數(shù)據(jù)副本。這是一個復(fù)制過程遞歸發(fā)生的過程。這意味著首先構(gòu)造一個新的集合對象,然后用在原始集合中找到的子對象的副本遞歸地填充它。在深度復(fù)制的情況下,對象的副本被復(fù)制到另一個對象中。這意味著對對象副本所做的任何更改都不會反映在原始對象中。
例如文章來源:http://www.zghlxwxcb.cn/news/detail-703239.html
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 dataframe
# and original dataframe
print('\nBefore Operation:\n', copydf == df)
# assignment operation
copydf['index'] = [0, 0, 0, 0]
# comparing shallow copied dataframe
# and original dataframe
print('\nAfter Operation:\n', copydf == df)
print('\nOriginal Dataframe after operation:\n', df)
輸出
在這里,原始對象中的數(shù)據(jù)不會被遞歸復(fù)制。也就是說,原始對象的數(shù)據(jù)中的數(shù)據(jù)仍然指向相同的存儲單元。例如,如果Dataframe或Series對象中的數(shù)據(jù)包含任何可變數(shù)據(jù),那么它將在它和它的深層副本之間共享,并且對其中一個的任何修改都將反映在另一個中。文章來源地址http://www.zghlxwxcb.cn/news/detail-703239.html
淺拷貝與深拷貝的區(qū)別
淺拷貝 | 深拷貝 |
---|---|
它是集合結(jié)構(gòu)的副本,而不是元素的副本。 | 它是集合的副本,其中復(fù)制了原始集合中的所有元素。 |
影響初始數(shù)據(jù)幀。 | 不影響初始數(shù)據(jù)幀。 |
淺拷貝不會復(fù)制子對象。 | 深拷貝遞歸地復(fù)制子對象。 |
創(chuàng)建淺拷貝比創(chuàng)建深拷貝快。 | 與淺拷貝相比,創(chuàng)建深拷貝速度較慢。 |
副本依賴于原件。 | 副本并不完全依賴于原件。 |
到了這里,關(guān)于Pandas數(shù)據(jù)中的淺拷貝與深拷貝的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!