有人可以向我解释一下之间的区别
df2 = df1
df2 = df1.copy()
df3 = df1.copy(deep=False)
我已经尝试了所有选项,并按如下方式执行:
df1 = pd.DataFrame([1,2,3,4,5])
df2 = df1
df3 = df1.copy()
df4 = df1.copy(deep=False)
df1 = pd.DataFrame([9,9,9])
并返回如下:
df1: [9,9,9]
df2: [1,2,3,4,5]
df3: [1,2,3,4,5]
df4: [1,2,3,4,5]
所以,我发现.copy()和.copy(deep = False)之间的输出没有区别.为什么?
我希望其中一个选项’=’,copy(),copy(deep = False)返回[9,9,9]
我错过了什么?
解决方法:
如果您看到您创建的各种DataFrame的对象ID,您可以清楚地看到发生了什么.
当您编写df2 = df1时,您正在创建一个名为df2的变量,并将其与ID为4541269200的对象绑定.当您编写df1 = pd.DataFrame([9,9,9])时,您正在创建一个新对象id 4541271120并将其绑定到变量df1,但之前绑定到df1的id为4541269200的对象仍然存在.如果没有绑定到该对象的变量,它将被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.
编辑:于7/30/2018添加
深度复制doesn’t work in 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]
df2,如果它是真正的深拷贝应该有其中包含的列表的新ID.因此,当您修改df2中的列表时,它也会影响df1中的列表,因为它们是相同的对象.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。