Pandas DataFrame 中淺複製與深複製的區別


Pandas 中最實用的資料結構之一是 Pandas DataFrame,它是一個二維表格狀結構,包含行和列來儲存資料。它允許使用者儲存和操作資料,非常類似於電子表格或 SQL 表格。

它還提供了一個稱為一維標記陣列的序列或線性資料結構,可以儲存任何資料型別的元素。

淺複製

顧名思義,淺複製建立一個新的 DataFrame 物件,該物件引用原始資料。換句話說,淺複製指向與原始 DataFrame 相同的記憶體位置。對淺複製所做的任何修改都會反映在原始 DataFrame 中,反之亦然。這種行為是由於原始物件和複製物件之間共享引用造成的。

語法

pandas.DataFrame.copy(deep=False)

如果 'deep=False',則建立 DataFrame 的淺複製,但資料和索引標籤不會被複制,相反,原始 DataFrame 和新 DataFrame 都將引用相同的資料和索引標籤。

深複製

深複製是指建立 DataFrame 的一個完全獨立的副本,包括其所有資料和元資料。換句話說,深複製建立一個具有其自身記憶體空間的全新 DataFrame 物件,使其獨立於原始 DataFrame。

語法

pandas.DataFrame.copy(deep=True)

引數“deep”:是可選的,其預設值為 True。如果 'deep=True',則建立 DataFrame 的深複製。因此,我們推斷建立一個新的 DataFrame 物件,並將所有資料和索引標籤從原始 DataFrame 複製到新 DataFrame。

示例

在此程式碼中,我們將建立一個 DataFrame 並進行深複製和淺複製,然後使用一些操作修改這三個 DataFrame,並演示原始 DataFrame、淺複製和深複製的不同變化。

演算法

  • 匯入 pandas 庫。

  • 定義一個包含 DataFrame 資料的字典。

  • 使用資料和 pd.DataFrame() 方法建立 DataFrame df。

  • 使用 copy() 函式以及引數 deep=False 和 deep=True,建立原始 DataFrame 的淺複製和深複製。

  • 要檢視各種更改,請更改每個 DataFrame 中任何所需的值。

  • 列印原始 DataFrame、淺複製和深複製。

  • 我們顯示原始 DataFrame 及其深複製和淺複製的 ID。

示例

import pandas as pd

# Create a DataFrame
data = {'Name': ['Rahul', 'Priya', 'Amit'],
    'Age': [25, 28, 22],
    'City': ['Mumbai', 'Delhi', 'Kolkata']}
df = pd.DataFrame(data)

# Shallow copy
shallow_copy = df.copy(deep=False)

# Deep copy
deep_copy = df.copy(deep=True)

# Modify a value in the original DataFrame
df.loc[0, 'Age'] = 30
shallow_copy.loc[1, 'City'] = 'Chennai'
deep_copy.loc[0, 'Age'] = 85

# Print the original DataFrame and its ID
print("Original DataFrame:\n", df)
print("Shallow Copy:\n", shallow_copy)
print("Deep Copy:\n", deep_copy)

print()
print("Original DataFrame ID:", id(df))
print("Shallow Copy ID:", id(shallow_copy))
print("Deep Copy ID:", id(deep_copy))

輸出

   Original DataFrame:
   Name  Age   City
0  Rahul   30   Mumbai
1  Priya   28  Chennai
2   Amit   22  Kolkata
Shallow Copy:
   Name  Age   City
0  Rahul   30   Mumbai
1  Priya   28  Chennai
2   Amit   22  Kolkata
Deep Copy:
   Name  Age   City
0  Rahul   85   Mumbai
1  Priya   28   Delhi
2   Amit   22  Kolkata

Original DataFrame ID: 140268239802704
Shallow Copy ID: 140269600767952
Deep Copy ID: 140269600767904

在這裡,原始 DataFrame 透過將第一行的年齡從 25 更改為 30 來修改,這也會反映在淺複製中。淺複製的資料沒有更改,因此獨立於原始 DataFrame。

同樣,當第二行的城市更改為“Chennai”時,它會影響淺複製和原始 DataFrame。另一方面,深複製是完全獨立的,因此當第一行的年齡更改為 85 時,它不會影響原始 DataFrame。

ID 顯示原始 DataFrame 及其副本是具有不同 ID 的不同物件,但淺複製確實與原始 DataFrame 共享大多數資料元素的記憶體空間,除了某些元資料。

因此,我們推斷,深度複製的物件現在是一個全新的物件,而淺複製物件只是一個指向原始 DataFrame 的另一個別名指標。

示例

以下程式碼演示了在 pandas 中複製國家和人口 DataFrame 的概念,並展示了在原始 DataFrame 及其淺複製和深複製中進行更改時,淺複製和深複製之間的區別。

演算法

  • 匯入 pandas 庫。

  • 建立一個字典資料,其中“國家”和“人口(百萬)”作為鍵,並具有相應的鍵值。

  • 使用字典資料建立一個 DataFrame df_original。

  • 使用 copy() 方法(deep=False)建立 df_original 的淺複製,並將其分配給 df_shallow_copy。

  • 使用 copy() 方法(deep=True)建立 df_original 的深複製,並將其分配給 df_deep_copy。

  • 透過使用 loc[] 更改特定行中的值來修改淺複製和深複製。

  • 使用 append() 方法將新行新增到原始 DataFrame df_original 和淺複製 DataFrame df_shallow_copy。

  • 列印原始 DataFrame 及其淺複製和深複製。

import pandas as pd

# Create a DataFrame
data = {'Country': ['USA', 'Germany', 'Japan'],
    'Population (Millions)': [328, 83, 126]}
df_original = pd.DataFrame(data)

# Shallow copy
df_shallow_copy = df_original.copy(deep=False)

# Deep copy
df_deep_copy = df_original.copy(deep=True)

# Modify the shallow copy 
df_shallow_copy.loc[0, 'Country'] = 'United States Of America'
df_shallow_copy.loc[1, 'Population (Millions)'] = 82

# Modify the deep copy 
df_deep_copy.loc[2, 'Country'] = 'India'
df_deep_copy.loc[2, 'Population (Millions)'] = 1400

# Add a new row to the original DataFrame
new_row = {'Country': 'Canada', 'Population (Millions)': 38}
df_original = df_original.append(new_row, ignore_index=True)

# Print the original DataFrame
print("Original DataFrame:")
print(df_original)

# Print the shallow copy
print("\nShallow Copy:")
print(df_shallow_copy)

# Print the deep copy
print("\nDeep Copy:")
print(df_deep_copy)

# Add a new row to the shallow copy DataFrame
new_row_shallow = {'Country': 'Australia', 'Population (Millions)': 25}
df_shallow_copy = df_shallow_copy.append(new_row_shallow, ignore_index=True)

# Print the modified shallow copy DataFrame
print("\nModified Shallow Copy:")
print(df_shallow_copy)

輸出

Original DataFrame:
      Country  Population (Millions)
0  United States Of America         328
1         Germany         82
2         Japan         126
3         Canada         38

Shallow Copy:
     Country  Population (Millions)
0  United States Of America         328
1         Germany         82
2         Japan         126

Deep Copy:
     Country  Population (Millions)
0   USA         328
1  Germany         83
2   India         1400

Modified Shallow Copy:
     Country  Population (Millions)
0  United States Of America         328
1         Germany         82
2         Japan         126
3        Australia         25

第一行的“國家”值從“USA”修改為“United States Of America”,第二行的“人口(百萬)”值從 83 修改為 82,這反映在淺複製以及原始 DataFrame 中,而將深複製中的國家名稱從 japan 更改為 India 以及其人口並不會影響原始 DataFrame。

原始 DataFrame 及其淺複製中新新增的行僅受其各自的 DataFrame 影響,因為在副本中新增新物件是私人的,不會影響原始 DataFrame,反之亦然。

淺複製和深複製的區別

淺複製 深複製
定義 建立一個新物件,該物件引用與原始物件相同的資料。 建立一個具有自身資料和元資料的完全獨立的副本。
資料共享 在原始物件和複製物件之間共享資料。不與原始物件共享資料。 不與原始物件共享資料。
記憶體空間 與原始物件共享記憶體空間。 擁有獨立於原始物件的記憶體空間。
可修改性 對副本進行的更改可能會影響原始物件,反之亦然。但是,新增特定於 DataFrame 的新項不會反映在原始 DataFrame 上。 對副本進行的更改不會影響原始物件,反之亦然。同樣,新增特定於 DataFrame 的新項不會反映在原始 DataFrame 上。
效能 速度更快,並且需要更少的記憶體,因為它避免了複製資料。 速度較慢,並且需要更多記憶體,因為它需要複製資料。

結論

當我們想要建立一個與原始 DataFrame 共享相同記憶體空間的新 DataFrame 時,淺複製很合適。在處理大型資料集時,它效率更高,因為它避免了不必要的記憶體複製。當我們需要建立 DataFrame 的獨立副本時,建議使用深複製。

更新於: 2023年8月10日

225 次瀏覽

開啟您的 職業生涯

透過完成課程獲得認證

立即開始
廣告

© . All rights reserved.