我对Python还不熟悉。我想在dataframe上尝试一些简单的函数操作,但遇到了以下问题。我的代码是:
>>> df.head(3)
PercChange
0 0.000000
1 -7.400653
2 2.176843
>>> def switch(array):
... for i in range(len(array)):
... if array[i]<0:
... array[i]=0
... return array
...
>>> a=df.PercChange
>>> a=switch(a)
>>> df['PosPercChange']=a
>>> df.head(3)
PercChange PosPercChange
0 0.000000 0.000000
1 0.000000 0.000000
2 2.176843 2.176843
为什么我的“PercChange”栏也变了?我已经分别为这些操作创建了一个新变量。如何避免不更改“PercChange”列?非常感谢
[已解决]
所以这就是数据结构的问题。在Python中,“=”赋值不会将值从一个复制到另一个,而是用不同的名称命名相同的序列,因此更改一个也会更改另一个。谢谢你的帮助
在Python中为变量赋值时,它不会复制值;变量只是成为相同值的新名称
所以,
a
和df.PercChange
是完全相同的Series
的不同名称。就像《星球大战五》的变化影响到《帝国反击战》或《前总统乔治W。“布什”影响“布什42总统”,改为a
影响df.PercChange
调用一个函数只是再次赋值:函数中的参数变成了另一个名称,其值与函数调用中的参数相同,因此
array
是与a
和df.PercChange
相同的对象如果要将
a
作为与df.PercChange
相同的数据的副本的名称,而不是同一对象的名称,则必须显式请求该副本对于熊猫,这通常只是^{} 方法:
但是熊猫(以及它下面的NumPy库)允许各种复杂的东西,所以有其他复杂的方法来复制东西
一般来说,Python有^{} 模块,带有
copy
和deepcopy
函数,可以对几乎所有内容进行浅拷贝或深拷贝,而不仅仅是熊猫系列但你也走到了另一个解决方案的一半。您的
switch
函数在末尾执行return array
,调用者执行a = switch(a)
如果
switch
返回一个不同的对象,a
现在将是该不同对象的名称。但是,因为它只是返回它的参数,所以在适当地修改它之后,a = switch(a)
所做的就是重新断言a
作为它已经是名称的相同值的名称所以,另一种解决问题的方法是在
switch
内进行复制:…或者建立一个全新的数组或序列并返回:
相关问题 更多 >
编程相关推荐