Python:Pandas对象的深浅拷贝

2023-11-18

这里仅以DataFrame为例进行说明。
Pandas版本:1.5.3

1 问题描述

  现有一DataFrame型变量A,现在需要对变量A做一些处理操作,但又希望保存A的一个原始副本。所以考虑将变量A赋值给变量B,然后再变量B上进行处理操作。但是处理完却发现A中的值也跟着发生了变动。具体举例如下:
在这里插入图片描述很显然,上述代码中虽然没有直接对A进行变换,但A的值还是发生了变化。这就涉及到了Python的深浅拷贝问题。本文主要关注Pandas对象的深浅拷贝,其他类型变量的深浅拷贝可以参考:https://blog.csdn.net/yeshang_lady/article/details/80755061

2 Pandas对象深浅拷贝

  Pandas中提供了copy()方法来对其对象进行拷贝,其内设的bool型参数deep可以设置是进行深拷贝。另外,copy标准库中deepcopy()方法也可以完成Pandas对象的深拷贝。这三者的区别如下:

  • deep=False:只对Pandas对象的数据和元素进行浅拷贝,即只复制数据和索引的引用,对副本变量的修改会影响原始数据。
  • deep=True:会对数据和索引进行复制。在副本变量上的修改不会影响原始变量。但这种复制不能递归(即当Pandas中的数据也是一个引用时,该方法不会对该引用的具体内容也进行复制)。
  • copy.deepcopy: 会对数据和索引进行复制,并且这种复制是可递归的。

2.1 对索引/列名的修改

  先创建对象A,并使用不同拷贝方法创建A的副本对象。先用id()方法来查看各个副本对象的列名/索引信息存放的位置是否相同。具体代码如下:

import pandas as pd
from copy import deepcopy
A=pd.DataFrame([['A',[3000,3002],22],
                ['B',[3010,2900],29]],columns=['col_1','col_2','col_3'])
A_deep=A.copy(deep=True)
A_shallow=A.copy(deep=False)
A_copy=deepcopy(A)

#查看各个对象的索引和列名的存放地址
print("对象A的索引存放地址:{},列名存放地址:{}".format(id(A.index),id(A.columns)))
print("对象A_deep的索引存放地址:{},列名存放地址:{}".format(id(A_deep.index),id(A_deep.columns)))
print("对象A_shallow的索引存放地址:{},列名存放地址:{}".format(id(A_shallow.index),id(A_shallow.columns)))
print("对象A_copy的索引存放地址:{},列名存放地址:{}".format(id(A_copy.index),id(A_copy.columns)))

其结果如下:
在这里插入图片描述
从图上可以看出,浅拷贝得到的对象A_shallow的索引和列名存放地址与原始变量A的存放地址相同。而其他两种方法得到的存放地址与原始变量A不同。但由于DataFrame型变量的索引和列名都是不可变对象,所以对A_shallow中的列名或索引的修改不会导致原始变量A的改变。具体如下:

#A_shallow.columns[0]='A1' 无法运行,提示其为不可变类型
A_shallow.columns=['A1','B1','C1'] #这种写法相当于将A_shallow的列名指向内存中另外一个地址
print("修改后的A_shallow的列名:",list(A_shallow.columns))
print("修改A_shallow的列名后A的列名:",list(A.columns))
print("修改后的A_shallow的列名存放地址:",id(A_shallow.columns))

其结果如下:
在这里插入图片描述
从图中可以看到,A_shallow的列名改名并没有导致A跟着变动。(修改索引也是)

2.2 数据修改

  • 第1种情况:浅拷贝(deep=False)。具体如下:
import pandas as pd
from copy import deepcopy
A=pd.DataFrame([['A',[3000,3002],22],
                ['B',[3010,2900],29]],columns=['col_1','col_2','col_3'])
A_shallow=A.copy(deep=False)
A_shallow.loc[0,'col_1']='C'
A_shallow['col_3']=[34,27]

A_shallow和A的值如下:
在这里插入图片描述
从结果上可以看到奇怪的现象,就是对A_shallow中col_3整列的修改并没有影响到A中的相应列,好似与浅拷贝的定义不符合。这是因为A_shallow中的col_3指向了新的内存地址,而A中col_3列指向的位置不变。这与下述代码同义:

a=[1,2]
print(a,id(a))
a[0]=0
print(a,id(a))
a=[2,3,5]
print(a,id(a))

其结果如下:
在这里插入图片描述

  • 第2种情况:深拷贝(deep=True)。具体如下:
import pandas as pd
from copy import deepcopy
A=pd.DataFrame([['A',[3000,3002],4002],
                ['B',[3010,2900],3009]],columns=['col_1','col_2','col_3'])
A_deep=A.copy(deep=True)
A_deep.loc[0,'col_1']='C'
A_deep.loc[0,'col_2'][0]=3
A_deep.loc[1,'col_2']=[2020]

其结果如下:
在这里插入图片描述

  • 第3种情况:deepcopy()方法。具体如下:
import pandas as pd
from copy import deepcopy
A=pd.DataFrame([['A',[3000,3002],4002],
                ['B',[3010,2900],3009]],columns=['col_1','col_2','col_3'])
A_copy=deepcopy(A)
A_copy['col_2']=[[2002,2012],[3030,2020]]
A_copy.loc[0,'col_1']='E'

其结果如下:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python:Pandas对象的深浅拷贝 的相关文章

  • 在 python 程序中合并第三方库的最佳实践是什么?

    下午好 我正在为我的工作编写一个中小型Python程序 该任务需要我使用 Excel 库xlwt and xlrd 以及一个用于查询 Oracle 数据库的库 称为CX Oracle 我正在通过版本控制系统 即CVS 开发该项目 我想知道围
  • Python 的键盘中断不会中止 Rust 函数 (PyO3)

    我有一个使用 PyO3 用 Rust 编写的 Python 库 它涉及一些昂贵的计算 单个函数调用最多需要 10 分钟 从 Python 调用时如何中止执行 Ctrl C 好像只有执行结束后才会处理 所以本质上没什么用 最小可重现示例 Ca
  • 使 django 服务器可以在 LAN 中访问

    我已经安装了Django服务器 可以如下访问 http localhost 8000 get sms http 127 0 0 1 8000 get sms 假设我的IP是x x x x 当我这样做时 从同一网络下的另一台电脑 my ip
  • 如何在flask中使用g.user全局

    据我了解 Flask 中的 g 变量 它应该为我提供一个全局位置来存储数据 例如登录后保存当前用户 它是否正确 我希望我的导航在登录后在整个网站上显示我的用户名 我的观点包含 from Flask import g among other
  • 如何替换 pandas 数据框列中的重音符号

    我有一个数据框dataSwiss其中包含瑞士城市的信息 我想用普通字母替换带有重音符号的字母 这就是我正在做的 dataSwiss Municipality dataSwiss Municipality str encode utf 8 d
  • SQLALchemy .query:类“Car”的未解析属性引用“query”

    我有一个这里已经提到的问题https youtrack jetbrains com issue PY 44557 https youtrack jetbrains com issue PY 44557 但我还没有找到解决方案 我使用 Pyt
  • 测试 python Counter 是否包含在另一个 Counter 中

    如何测试是否是pythonCounter https docs python org 2 library collections html collections Counter is 包含在另一个中使用以下定义 柜台a包含在计数器中b当且
  • 使用 Tkinter 显示 numpy 数组中的图像

    我对 Python 缺乏经验 第一次使用 Tkinter 制作一个 UI 显示我的数字分类程序与 mnist 数据集的结果 当图像来自 numpy 数组而不是我的 PC 上的文件路径时 我有一个关于在 Tkinter 中显示图像的问题 我为
  • AWS EMR Spark Python 日志记录

    我正在 AWS EMR 上运行一个非常简单的 Spark 作业 但似乎无法从我的脚本中获取任何日志输出 我尝试过打印到 stderr from pyspark import SparkContext import sys if name m
  • 如何在ipywidget按钮中显示全文?

    我正在创建一个ipywidget带有一些文本的按钮 但按钮中未显示全文 我使用的代码如下 import ipywidgets as widgets from IPython display import display button wid
  • Flask如何获取请求的HTTP_ORIGIN

    我想用我自己设置的 Access Control Allow Origin 标头做出响应 而弄清楚请求中的 HTTP ORIGIN 参数在哪里似乎很混乱 我在用着烧瓶 0 10 1 以及HTTP ORIGIN似乎是这个的特点之一object
  • IO 密集型任务中的 Python 多线程

    建议仅在 IO 密集型任务中使用 Python 多线程 因为 Python 有一个全局解释器锁 GIL 只允许一个线程持有 Python 解释器的控制权 然而 多线程对于 IO 密集型操作有意义吗 https stackoverflow c
  • 对年龄列进行分组/分类

    我有一个数据框说df有一个柱子 Ages gt gt gt df Age 0 22 1 38 2 26 3 35 4 35 5 1 6 54 我想对这个年龄段进行分组并创建一个像这样的新专栏 If age gt 0 age lt 2 the
  • 为字典中的一个键附加多个值[重复]

    这个问题在这里已经有答案了 我是 python 新手 我有每年的年份和值列表 我想要做的是检查字典中是否已存在该年份 如果存在 则将该值附加到特定键的值列表中 例如 我有一个年份列表 并且每年都有一个值 2010 2 2009 4 1989
  • 解释 Python 中的数字范围

    在 Pylons Web 应用程序中 我需要获取一个字符串 例如 关于如何做到这一点有什么建议吗 我是 Python 新手 我还没有找到任何可以帮助解决此类问题的东西 该列表将是 1 2 3 45 46 48 49 50 51 77 使用
  • 有没有办法检测正在运行的代码是否正在上下文管理器内执行?

    正如标题所述 有没有办法做到这样的事情 def call back if called inside context print running in context else print called outside context 这将
  • 如何计算 pandas 数据帧上的连续有序值

    我试图从给定的数据帧中获取连续 0 值的最大计数 其中包含来自 pandas 数据帧的 id date value 列 如下所示 id date value 354 2019 03 01 0 354 2019 03 02 0 354 201
  • 在 Qt 中自动调整标签文本大小 - 奇怪的行为

    在 Qt 中 我有一个复合小部件 它由排列在 QBoxLayouts 内的多个 QLabels 组成 当小部件调整大小时 我希望标签文本缩放以填充标签区域 并且我已经在 resizeEvent 中实现了文本大小的调整 这可行 但似乎发生了某
  • Python Selenium:如何在文本文件中打印网站上的值?

    我正在尝试编写一个脚本 该脚本将从 tulsaspca org 网站获取以下 6 个值并将其打印在 txt 文件中 最终输出应该是 905 4896 7105 23194 1004 42000 放置的动物 的 HTML span class
  • NotImplementedError:无法将符号张量 (lstm_2/strided_slice:0) 转换为 numpy 数组。时间

    张量流版本 2 3 1 numpy 版本 1 20 在代码下面 define model model Sequential model add LSTM 50 activation relu input shape n steps n fe

随机推荐

  • 最佳实践:基于vite3的monorepo前端工程搭建

    一 技术栈选择 1 代码库管理方式 Monorepo 将多个项目存放在同一个代码库中 选择理由1 多个应用 可以按业务线产品粒度划分 在同一个repo管理 便于统一管理代码规范 共享工作流 选择理由2 解决跨项目 应用之间物理层面的代码复用
  • openstack Storage 组件 Swift 和 Cinder

    Storage 组件 Swift 和 Cinder 本文将介绍 OpenStack Block Swift 和 Object Glance 存储 解释它如何融入到整体架构中 并展示它的操作方式 本文还将在介绍这些工具的过程中了解了如何安装
  • CMake GUI工具使用 MinGW 64构建工程

    系列文章目录 文章目录 系列文章目录 前言 一 open Project是灰色 前言 CMake GUI 打开 CMake GUI 在 Where is the source code 字段中 选择 Krita 源代码目录 E krita
  • 学习笔记-汉诺塔 分治算法

    用分治算法解决汉诺塔 分治法是一种很重要的算法 字面上的解释是 分而治之 就是把一个复杂的问题分成两个或更多的相同或相似的子问题 再把子问题分成更小的子问题 直到最后子问题可以简单的直接求解 原问题的解即子问题的解的合并 这个技巧是很多高效
  • vue(十二)——vue3新特性之Teleport

    teleport是什么 teleport其实就是vue3新增的一个内置组件 其实就是一个新增标签 teleport的作用 官方解释 将其插槽内容渲染到 DOM 中的另一个位置 简单来说就是将dom节点挂载到你指定的位置 遮挡层案例举例 遮挡
  • Linux 设置文件夹可读可写

    在 Linux 系统中 可以使用 chmod 命令来更改文件夹的读写权限 设置文件夹可读可写 可以使用如下命令 chmod R777 path to folder 其中 chmod 是更改文件权限的命令 R 是递归更改权限 包括子文件夹和文
  • AD中拖动器件,无法移动在一起如何解决

    1 AD PCB拖动器件 无法移动在一起时如何解决 在PCB 界面 按下快捷键O P进入 preference对话框 找到PCB Edit gt Interactive Routing gt Dragging gt Component Pu
  • QT中文显示问题

    问题 http topic csdn net u 20090320 10 287c7dba 29c0 4d76 af75 4d19104f544e html C C code QTextCodec text QTextCodec codec
  • 【Java视频教程等百度云资源分享】

    韩顺平javase 87讲 密码 hsp789 链接 https pan baidu com s 1eNCyvFcVHsd7P4gdvrFqtw密码 el1y 韩顺平javaee 66讲 密码 hsp789 链接 HTTPS pan bai
  • Error occurred when evaluating apply callback【计算应用回调时发生错误】

    Error occurred when evaluating apply callback 在simulink里面的serial configuration模块里面选择串口是出现这个报错 首先我使用的是虚拟串口 com1和com2连接 前几
  • java线程屏障CyclicBarrier

    CyclicBarrier允许一组线程在达到一个公共的屏障点时相互等待 它在涉及固定大小的线程组 并且这些线程必须相互等待的程序中非常有用 CyclicBarrier可以在等待的线程被释放后被重用 构造方法 CyclicBarrier in
  • 解决微信小程序中在其他页面无法使用app.js中获取的userInfo或openid的问题

    问题 最近写小程序中 在app js里获取用户的openid和userinfo 并存储为全局变量 getUserInfo function var that this wx getUserInfo success function res
  • 服务器虚拟机如何连接显示器,Windows 10:如何在VMware虚拟机上使用双显示器

    VMware不允许您为任何客户机操作系统使用更多的监视器 但是 您可以绕过此默认设置并将双监视器与VMware虚拟机配合使用 无论您在虚拟机中安装了哪个操作系统 如果您有多个显示器 您都可以使用它们 默认情况下 VMware仅检测一个监视器
  • Hadoop分布式生态

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 Hadoop系统架构 二 HDFS 1 设计理念 2 架构原理 2 文件写入与读取 4 数据备份 三 MapReduce 1 设计思想 2 架构原理 3
  • imblearn:随机过采样(过采样)

    随机过采样的核心思想 随机的复制 重复少数类样本 最终使得少数类与多数类的个数相同从而得到一个新的均衡的数据集 最简单的过采样方法 imblearn from imblearn over sampling import RandomOver
  • 字符集、编码、Oracle

    目录 一 字符集与编码常识 字符集 编码 ASCII GB2312 GBK GB18030 第二部分 Oracle中的编码与字符集 1 为什么需要两个字符集 2 字符集名称的玄机 3 例子很重要 3 1 准备两个数据库 3 2 工具很重要
  • 为虾米下载《分布式网站负载压力测试工具》变成了《黄色小说》?

    时间早上8点 有一条QQ消息来源 2013 05 24 8 20 20 你好 我在http wst cyqdata com 页面下载压力测试工具时解压后的内容是小说 当然了 一般早上我都不在人间 所以到了中午很疑惑的回复了 号过去 下午1点
  • 小样本学习(one/few-shot learning)

    原文 https blog csdn net mao feng article details 78939864 原博地址 https blog csdn net xhw205 article details 79491649 小样本学习
  • 拉肚子差评回复模板_遇到差评,餐厅这样对症回复就对了!

    大众点评的大数据公开资料显示 80 以上的80 90后在选择就餐时会参考别人的意见 而差评会影响餐厅在外卖平台的排名 一个差评需要几十个五星好评才能抵消 差评成了餐饮老板和店长最怕的事 像躲瘟疫一样避之不及 一味逃避 或者采取不恰当措施 都
  • Python:Pandas对象的深浅拷贝

    这里仅以DataFrame为例进行说明 Pandas版本 1 5 3 1 问题描述 现有一DataFrame型变量A 现在需要对变量A做一些处理操作 但又希望保存A的一个原始副本 所以考虑将变量A赋值给变量B 然后再变量B上进行处理操作 但