首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python Pandas DataFrame copy(deep=False) vs copy(deep=True) vs '=‘

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

Stack Overflow用户
提问于 2017-09-21 00:39:48
回答 3查看 32.9K关注 0票数 45

有人能给我解释一下

代码语言:javascript
复制
df2 = df1

df2 = df1.copy()

df3 = df1.copy(deep=False)

我已经尝试了所有选项,并执行了以下操作:

代码语言:javascript
复制
df1 = pd.DataFrame([1,2,3,4,5])
df2 = df1
df3 = df1.copy()
df4 = df1.copy(deep=False)
df1 = pd.DataFrame([9,9,9])

并按如下方式返回:

代码语言:javascript
复制
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]

我错过了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-09-21 02:33:09

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

当您编写df2 = df1时,您将创建一个名为df2的变量,并将其与一个id为4541269200的对象绑定。当您编写df1 = pd.DataFrame([9,9,9])时,您将创建一个id为4541271120的新对象,并将其绑定到变量df1,但是先前绑定到df1的id为4541269200的对象将继续存在。如果没有绑定到该对象的变量,Python将对其进行垃圾回收。

代码语言:javascript
复制
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.

编辑:2018年7月30日新增

深度复制doesn't work in pandas和devs考虑将可变对象放在DataFrame中作为反模式。请考虑以下几点:

代码语言:javascript
复制
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,如果它是一个真正的深度副本,那么它所包含的列表应该有新的ids。因此,当您修改df2中的列表时,它也会影响df1中的列表,因为它们是相同的对象。

票数 42
EN

Stack Overflow用户

发布于 2017-12-26 22:36:12

Deep copy为它包含的每个对象创建新的id,而normal copy只复制父对象中的元素,并为要复制到的变量创建新的id。

df2df3df4都不显示[9,9,9]的原因是:

代码语言:javascript
复制
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'.
票数 6
EN

Stack Overflow用户

发布于 2018-09-19 12:59:31

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

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46327494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档