python Pandas DataFrame copy(deep = False)vs copy(deep = True)vs'='

Nul*_*yte 23 python deep-copy dataframe pandas

有人可以向我解释一下之间的区别

df2 = df1

df2 = df1.copy()

df3 = df1.copy(deep=False)
Run Code Online (Sandbox Code Playgroud)

我已经尝试了所有选项,并按如下方式执行:

df1 = pd.DataFrame([1,2,3,4,5])
df2 = df1
df3 = df1.copy()
df4 = df1.copy(deep=False)
df1 = pd.DataFrame([9,9,9])
Run Code Online (Sandbox Code Playgroud)

并返回如下:

df1: [9,9,9]
df2: [1,2,3,4,5]
df3: [1,2,3,4,5]
df4: [1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)

所以,我发现.copy()和之间的输出没有区别.copy(deep=False).为什么?

我希望返回一个选项'=',copy(),copy(deep = False) [9,9,9]

我错过了什么?

Kar*_*k V 21

如果您看到您创建的各种DataFrame的对象ID,您可以清楚地看到发生了什么.

在编写时df2 = df1,您将创建一个名为的变量df2,并将其与具有id的对象绑定4541269200.在编写时df1 = pd.DataFrame([9,9,9]),您正在创建一个具有id 的对象4541271120并将其绑定到变量df1,但具有4541269200以前绑定的id的对象将df1继续存在.如果没有绑定到该对象的变量,它将被Python收集垃圾.

In[33]: import pandas as pd
In[34]: df1 = pd.DataFrame([1,2,3,4,5])
In[35]: id(df1)
Out[35]: 4541269200

In[36]: df2 = df1
In[37]: id(df2)
Out[37]: 4541269200  # Same id as df1

In[38]: df3 = df1.copy()
In[39]: id(df3)
Out[39]: 4541269584  # New object, new id.

In[40]: df4 = df1.copy(deep=False)
In[41]: id(df4)
Out[41]: 4541269072  # New object, new id.

In[42]: df1 = pd.DataFrame([9, 9, 9])
In[43]: id(df1)
Out[43]: 4541271120  # New object created and bound to name 'df1'.

In[44]: id(df2)
Out[44]: 4541269200  # Old object's id not impacted.
Run Code Online (Sandbox Code Playgroud)

编辑:于7/30/2018添加

深度复制在pandas中不起作用,开发人员会考虑将可变对象作为反模式放在DataFrame中.考虑以下:

In[10]: arr1 = [1, 2, 3]
In[11]: arr2 = [1, 2, 3, 4]
In[12]: df1 = pd.DataFrame([[arr1], [arr2]], columns=['A'])
In[13]: df1.applymap(id)
Out[13]: 
            A
0  4515714832
1  4515734952

In[14]: df2 = df1.copy(deep=True)
In[15]: df2.applymap(id)
Out[15]: 
            A
0  4515714832
1  4515734952

In[16]: df2.loc[0, 'A'].append(55)
In[17]: df2
Out[17]: 
               A
0  [1, 2, 3, 55]
1   [1, 2, 3, 4]
In[18]: df1
Out[18]: 
               A
0  [1, 2, 3, 55]
1   [1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

df2,如果它是真正的深拷贝应该有其中包含的列表的新ID.因此,当您修改df2中的列表时,它也会影响df1中的列表,因为它们是相同的对象.

  • 嗨!但是df1.copy()和df1.copy(deep = False)之间有什么区别?你能改进一些例子来展示这种差异吗? (7认同)

Ama*_*wal 5

深拷贝为它包含的每个对象创建新的 id,而普通拷贝只从父元素复制元素并为它复制到的变量创建一个新的 id。

没有df2,df3df4显示的原因[9,9,9]是:

In[33]: import pandas as pd
In[34]: df1 = pd.DataFrame([1,2,3,4,5])
In[35]: id(df1)
Out[35]: 4541269200

In[36]: df2 = df1
In[37]: id(df2)
Out[37]: 4541269200  # Same id as df1

In[38]: df3 = df1.copy()
In[39]: id(df3)
Out[39]: 4541269584  # New object, new id.

In[40]: df4 = df1.copy(deep=False)
In[41]: id(df4)
Out[41]: 4541269072  # New object, new id.

In[42]: df1 = pd.DataFrame([9, 9, 9])
In[43]: id(df1)
Out[43]: 4541271120  # New object created and bound to name 'df1'.
Run Code Online (Sandbox Code Playgroud)


小智 5

您需要单独修改 df 的元素。尝试以下操作

df1 = pd.DataFrame([1,2,3,4,5])
df2 = df1
df3 = df1.copy()
df4 = df1.copy(deep=False)

df1.iloc[0,0] = 6
df2.iloc[1,0] = 7
df4.iloc[2,0] = 8

print(df1)
print(df2)
print(df3)
print(df4)

df1:        df2:        df3:        df4:
   0           0           0           0
0  6        0  6        0  1        0  6
1  7        1  7        1  2        1  7
2  8        2  8        2  3        2  8
3  4        3  4        3  4        3  4
4  5        4  5        4  5        4  5
Run Code Online (Sandbox Code Playgroud)