📅  最后修改于: 2023-12-03 15:18:15.018000             🧑  作者: Mango
数据框 (DataFrames) 是 pandas 软件库中用于存储和操作带标签列和行的二维数据结构的主要工具。这篇文章介绍了 pandas 数据框中浅拷贝与深拷贝的区别。
浅拷贝创建一个新的对象,该对象与原始对象共享相同的内存地址,因此改变其中一个对象的值,也会改变另一个对象的值。
import pandas as pd
df = pd.DataFrame({'col1': [1, 2], 'col2': [3, 4]})
df_copy = df
df_copy['col1'][0] = 5
print(df['col1'][0]) # 5
在这个例子中,我们将 df
数据框分配给 df_copy
变量。因此,在对 df_copy 进行更改时,原始的 df 也被更改了,因为它们共享同一块内存地址。
深拷贝是创建一个新的对象,并与原始对象不共享内存地址。这意味着在更改一个对象的值时,不会影响到另一个对象。
import pandas as pd
df = pd.DataFrame({'col1': [1, 2], 'col2': [3, 4]})
df_copy = df.copy()
df_copy['col1'][0] = 5
print(df['col1'][0]) # 1
在这个例子中,我们使用 .copy()
方法对 df
数据框进行深拷贝,并将新的数据框对象分配给 df_copy
变量。当我们更改 df_copy
中的值时,原始 df
数据框不会更改。
有几个方法可以确定 Pandas 数据框是浅拷贝还是深拷贝。
is
运算符可以使用 is
运算符来比较数据框是否位于同一个内存地址。
import pandas as pd
df = pd.DataFrame({'col1': [1, 2], 'col2': [3, 4]})
df_copy = df
df_deepcopy = df.copy()
print(df is df_copy) # True
print(df is df_deepcopy) # False
在这个例子中,我们比较了 df
和 df_copy
以及 df
和 df_deepcopy
是否位于同一个内存地址。我们发现 df
和 df_copy
是同一个对象(浅拷贝),而 df
和 df_deepcopy
不是同一个对象(深拷贝)。
id()
函数可以使用 id()
函数来获取数据框对象的内存地址。
import pandas as pd
df = pd.DataFrame({'col1': [1, 2], 'col2': [3, 4]})
df_copy = df
df_deepcopy = df.copy()
print(id(df)) # 4341411456
print(id(df_copy)) # 4341411456
print(id(df_deepcopy)) # 4382791232
在这个例子中,我们使用 id()
函数获取 df
,df_copy
和 df_deepcopy
的内存地址。我们发现 df
和 df_copy
有相同的内存地址,而 df_deepcopy
不同。
copy()
方法使用 copy()
方法对数据框进行深拷贝,直接对原始数据框进行更改,说明原始数据框是浅拷贝。
import pandas as pd
df = pd.DataFrame({'col1': [1, 2], 'col2': [3, 4]})
df_copy = df
df_deepcopy = df.copy()
df['col1'][0] = 5
print(df is df_copy) # True
print(df is df_deepcopy) # False
在这个例子中,我们使用 .copy()
方法对 df
进行深拷贝,并将新的数据框对象分配给 df_deepcopy
变量。然后我们更改了 df
中的值,并发现更改也出现在 df_copy
中(浅拷贝),但不会出现在 df_deepcopy
中(深拷贝)。
浅拷贝和深拷贝是处理数据框的重要工具,因为每种类型都有适用的情况。浅拷贝是常用的一种,当一个新的对象需要指向与原始对象相同的内存地址时,浅拷贝比较实用。深拷贝则可用于更改数据框而不影响原始数据的情况。