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

2024-10-02 08:19:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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中,“=”赋值不会将值从一个复制到另一个,而是用不同的名称命名相同的序列,因此更改一个也会更改另一个。谢谢你的帮助


Tags: 函数代码indataframedfforlenif
1条回答
网友
1楼 · 发布于 2024-10-02 08:19:14

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

所以,adf.PercChange是完全相同的Series的不同名称。就像《星球大战五》的变化影响到《帝国反击战》或《前总统乔治W。“布什”影响“布什42总统”,改为a影响df.PercChange

调用一个函数只是再次赋值:函数中的参数变成了另一个名称,其值与函数调用中的参数相同,因此array是与adf.PercChange相同的对象

如果要将a作为与df.PercChange相同的数据的副本的名称,而不是同一对象的名称,则必须显式请求该副本


对于熊猫,这通常只是^{}方法:

a = df.PercChange.copy()    

但是熊猫(以及它下面的NumPy库)允许各种复杂的东西,所以有其他复杂的方法来复制东西


一般来说,Python有^{}模块,带有copydeepcopy函数,可以对几乎所有内容进行浅拷贝或深拷贝,而不仅仅是熊猫系列


但你也走到了另一个解决方案的一半。您的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

…或者建立一个全新的数组或序列并返回:

def switch(array):
    return array.apply(lambda: 0 if x<0 else x)

相关问题 更多 >

    热门问题