为啥 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 中的对象替换我的自定义结构?

为啥 Python 3 中的切片仍然是副本而不是视图?

更新状态 - 为啥在调用 setState 时创建新的状态副本?

为啥链接器看不到我的函数(定义宏来替换系统日志)?

为啥 Python for 循环在遍历列表副本并进行删除时会跳过元素? [复制]

为啥在已删除的默认 ctor 旁边定义一个空的副本 ctor 会使空列表的值初始化失败?