为啥 Python 用后来调整的副本替换早期定义的 Pandas 数据框? [复制]
Posted
技术标签:
【中文标题】为啥 Python 用后来调整的副本替换早期定义的 Pandas 数据框? [复制]【英文标题】:Why does Python replace an earlier defined Pandas dataframe with it's later adjusted copy? [duplicate]为什么 Python 用后来调整的副本替换早期定义的 Pandas 数据框? [复制] 【发布时间】:2020-10-17 10:48:41 【问题描述】:我是 Python 新手,想要复制现有的 Pandas 数据框 (x1
) 的副本 (x2
),并将所有现有值调整为另一个值(或将它们设置为例如 NaN
)。尝试如下:
x1 = pd.DataFrame('x':[1,2,3], 'y':[4,5,6])
x2 = x1
x2[:] = 5
x1
不过,在将 x2
的所有值重新定义为 5 后,x1
也会重新定义。这种重新定义现有变量的行为是非常不受欢迎的。为什么会发生这种情况以及如何预防?提前致谢!
【问题讨论】:
这就是任何对象在 Python 中的工作方式。赋值不是 C++ 中的副本。使用x1.copy()
。
没有在任何地方创建副本。 x2 = x1
不会复制。 赋值从不复制 python 中的任何内容 “这种重新定义现有变量的行为是非常不受欢迎的。”什么都没有被重新定义。
虽然不完全是关于 pandas,但您应该阅读以下内容:nedbatchelder.com/text/names.html 它适用于所有 Python 对象。阅读它并学习按照自己的术语理解 Python,而不是尝试将其他语言(猜测 C 或 C++)的语义应用于 Python。
感谢 juanpa.arrivillaga 和 ggorlen 的详细说明和进一步阅读的参考!
【参考方案1】:
说x2 = x1
会使x2
指向与x1
相同的对象。为了防止这种情况发生,您需要复制x1
并将其分配给x2
。
试试x2 = x1.copy()
【讨论】:
正是我需要的,感谢您的快速帮助!以上是关于为啥 Python 用后来调整的副本替换早期定义的 Pandas 数据框? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥 autorest 用 Swagger 中的对象替换我的自定义结构?
更新状态 - 为啥在调用 setState 时创建新的状态副本?