我是Python新手。我想在数据帧上尝试一些简单的函数操作,但我遇到了以下问题。我的代码是:
https://api.github.com/user
为什么我的'PercChange'列也会发生变化?我已经分别为操作创建了一个新变量。如何避免不更改“PercChange”列?非常感谢。
[解决]
所以这是数据结构的问题。在Python中,'='赋值不会将值从一个复制到另一个,而是使用不同的名称命名相同的序列,因此更改一个也会更改另一个。谢谢你的帮助。
答案 0 :(得分:1)
在Python中为变量赋值时,它不会复制值;变量只是成为相同值的新名称。
因此,a
和df.PercChange
只是完全相同Series
的不同名称。改变“星球大战V”影响“帝国罢工”或改变“前总统乔治W.布什”影响“布什总统42”,改为a
影响{{1} }。
调用函数只是再次赋值:函数内部的参数成为与函数调用中的参数相同的值的另一个名称,因此df.PercChange
与array
和{a
是同一个对象{1}}。
如果您想将df.PercChange
作为相同数据的副本的名称,而不是a
的名称,而不是同一个对象,你必须明确要求该副本。
使用Pandas,这通常只是copy
方法:
df.PercChange
但是Pandas(以及作为它的基础的NumPy库)允许各种复杂的事情,所以还有其他复杂的方法来复制东西。
更一般地说,Python有copy
模块,a = df.PercChange.copy()
和copy
函数可以制作几乎任何东西的浅或深拷贝,而不仅仅是Pandas系列。
但是你也有一个不同的解决方案。您的deepcopy
函数最后会switch
,并且您的来电者会return array
。
如果a = switch(a)
返回不同的对象,switch
现在将成为该不同对象的名称。但是,因为它只是返回它的参数,在就地修改之后,a
正在做的就是重新声明a = switch(a)
作为它已经是名称的相同值的名称。
因此,解决问题的另一种方法是在a
内进行复制:
switch
...或者建立一个全新的数组或系列并返回:
def switch(array):
array = array.copy()
for i in range(len(array)):
if array[i]<0:
array[i]=0
return array