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
在這種情況下,原始物件中包含的資料不會遞迴複製。包含在原始物件資料中的資料仍然指向同一個記憶體單元。
例如,如果一個系列物件中的資料是可變的,它將在它和它的深層副本之間共享,並且對一個物件的任何更改都將反映在另一個物件中。