Python执行操作时为什么数据会相互更新?

时间:2018-06-16 04:35:11

标签: python pandas dataframe

我是Python新手。我想在数据帧上尝试一些简单的函数操作,但我遇到了以下问题。我的代码是:

https://api.github.com/user

为什么我的'PercChange'列也会发生变化?我已经分别为操作创建了一个新变量。如何避免不更改“PercChange”列?非常感谢。

[解决]

所以这是数据结构的问题。在Python中,'='赋值不会将值从一个复制到另一个,而是使用不同的名称命名相同的序列,因此更改一个也会更改另一个。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

在Python中为变量赋值时,它不会复制值;变量只是成为相同值的新名称。

因此,adf.PercChange只是完全相同Series的不同名称。改变“星球大战V”影响“帝国罢工”或改变“前总统乔治W.布什”影响“布什总统42”,改为a影响{{1} }。

调用函数只是再次赋值:函数内部的参数成为与函数调用中的参数相同的值的另一个名称,因此df.PercChangearray和{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