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