加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 在复制之后但在编辑副本之前编辑原始DataFrame更改副

发布时间:2020-12-20 11:37:09 所属栏目:Python 来源:网络整理
导读:我试图了解如何复制pandas数据框.当我在 python中分配对象的副本时,我不习惯更改影响该对象副本的原始对象.例如: x = 3y = xx = 4print(y)3 虽然x随后被更改,但y保持不变.相反,当我将pandas df分配给副本df1后对其进行更改时,副本也会受到原始DataFrame更改
我试图了解如何复制pandas数据框.当我在 python中分配对象的副本时,我不习惯更改影响该对象副本的原始对象.例如:

x = 3
y = x
x = 4
print(y)
3

虽然x随后被更改,但y保持不变.相反,当我将pandas df分配给副本df1后对其进行更改时,副本也会受到原始DataFrame更改的影响.

import pandas as pd
import numpy as np

def minusone(x):
    return int(x) - 1

df = pd.DataFrame({"A": [10,20,30,40,50],"B": [20,10,"C": [32,234,23,42523]})

df1 = df


print(df1['A'])

0    10
1    20
2    30
3    40
4    50
Name: A,dtype: int64

df['A'] = np.vectorize(minusone)(df['A'])

print(df1['A'])

0     9
1    19
2    29
3    39
4    49
Name: A,dtype: int64

解决方案似乎是使用copy.deepcopy()进行深层复制,但是因为这种行为与我在python中习惯的行为不同,我想知道是否有人可以解释这种差异背后的原因是什么,或者它是否是错误.

解决方法

在第一个示例中,您没有更改x的值.您为x分配了一个新值.

在第二个示例中,您通过更改其中一个列来修改df的值.

你也可以看到内置类型的效果:

>>> x = []
>>> y = x
>>> x.append(1)
>>> y
[1]

这种行为并非特定于熊猫;它是Python的基础.关于同样的问题,这个网站上有很多很多问题,都源于同样的误解.语法

barename = value

与Python中的任何其他构造没有相同的行为.

当使用name [key] = value或name.attr = value或name.methodcall()时,您可能正在改变名称引用的对象的值,您可能正在复制某些内容等.使用name = value(其中name是单个标识符,没有点,没有括号等),你永远不会改变任何东西,也不会复制任何东西.

在你的第一个例子中,你使用了语法x = ….在你的第二个例子中,你使用了语法df [‘A’] = ….这些语法不一样,所以你不能假设它们有相同的行为.

制作副本的方式取决于您尝试复制的对象类型.对于您的情况,请使用df1 = df.copy().

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读