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