df1 = pd.DataFrame({'A':['aaa','bbb','ccc'], 'B':[1,2,3]})
df2=df1.copy()
df1.loc[0,'A']='111' #modifying the 1st element of column A
print df1
print df2
修改df1
时,不会修改对象sf2
。我期待它,因为我用了copy()
s1=pd.Series([[1,2],[3,4]])
s2=s1.copy()
s1[0][0]=0 #modifying the 1st element of list [1,2]
print s1
print s2
但为什么在这种情况下s2
也发生了变化?我不希望s2
发生任何变化,因为我使用了copy()
来创建它,但出乎意料的是,当修改s1
时,对象s2
也被修改了。我不明白为什么。你知道吗
发生这种情况是因为
pd.Series
是dtype=object,所以它实际上复制了一堆对python对象的引用。观察:由于
list
对象是可变的,因此操作:就地修改列表。你知道吗
这种行为是一种“浅层复制”,通常情况下,
pandas
数据结构没有问题,因为通常您将使用数字数据类型,在这种情况下浅层复制不适用,或者如果您使用object dtype,您将使用python string对象,它们是不可变的。你知道吗注意,
pandas
容器对深度副本有不同的概念。注意.copy
方法有一个默认的deep=True
,但是从文档中可以看到:同样,这是因为
pandas
是为使用数字数据类型而设计的,对str
对象有一些内置的支持。一个pd.Series
的list
对象确实很奇怪,对于pd.Series
来说,这并不是一个好的用例。你知道吗当您复制
s1
对象时,它实际上创建了一个新的、独立的Series对象并将其引用到s2
——正如您所期望的那样。但是,s1
Series对象中的two list没有与Series重复。它只是复制了他们的参考资料。你知道吗请参见here,以了解Python
reference
和object
之间的区别。你知道吗简单地说,Python
variable
与实际的Python对象不同。变量(如s1
和s2
)只是指向实际对象所在内存位置的引用。你知道吗因为原始序列对象
s1
包含两个列表引用,而不是两个列表对象,所以只复制了内部列表对象的references
(而不是列表对象本身)。你知道吗输出:
@juanpa.arrivillaga
她的回答是正确的,你需要使用deep copy相关问题 更多 >
编程相关推荐