Python:Pandas对象的深浅拷贝
创始人
2025-05-31 00:21:51

这里仅以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'

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

相关内容

热门资讯

男子撞豪车转头炫耀(撞豪车案例... 本篇文章极速百科给大家谈谈男子撞豪车转头炫耀,以及撞豪车案例对应的知识点,希望对各位有所帮助,不要忘...
虚词有哪些虚词包括哪些类别(虚... 本篇文章极速百科给大家谈谈虚词有哪些虚词包括哪些类别,以及虚词有哪些虚词包括哪些类别的词语对应的知识...
随机过程 Poisson 过程 文章目录随机过程 Poisson 过程基本概念与 Poisson 过程相联系的若干分布XnX_nXn...
【C++初阶】六、模板初阶(函... 文章目录泛型编程函数模板函数模板的概念函数模板的格式函数模板的原理函数模板的实例化模板参数的匹配原则...
每个开发人员都需要掌握的10 ... SQL 是一种非常常见但功能强大的工具,它可以帮助从任何数据库中提取、转换和加载数据。...
每年的918都有哪些地方会拉响... 本篇文章极速百科给大家谈谈每年的918都有哪些地方会拉响防空警报?,以及918那些地方有拉防空警报对...
慢直播是什么意思(慢直播怎么赚... 本篇文章极速百科给大家谈谈慢直播是什么意思,以及慢直播怎么赚钱对应的知识点,希望对各位有所帮助,不要...
09款福特嘉年华自动挡1.5的... 本篇文章极速百科给大家谈谈09款福特嘉年华自动挡1.5的换一套机脚垫要多少钱啊,以及对应的知识点,希...
什么是有机奶(什么是有机奶和纯... 本篇文章极速百科给大家谈谈什么是有机奶,以及什么是有机奶和纯牛奶的区别对应的知识点,希望对各位有所帮...
[图神经网络]图卷积神经网络-... 一、消息传递         由于图具有“变换不变性”(即图的空间结构改变不会影响图的性状)...
Learning C++ No... 引言: 北京时间:2023/3/18/21:47,周末&#...
数据结构第一二章笔记 仅仅是自己学习记的一些笔记。1.一些零碎的知识时间复杂度:找出哪一条语句执行的次数最多...
cmake-下载和安装 1.下载和安装 cmake:https://cmake.org/download/ (...
JDBC教程下篇 二、SQL注入 2.1 什么是SQL注入 用户输入的数据中有SQL关键词,导致在执行SQL语句时出...
钛动科技斩获 2022 Tik... 近日,第三方平台FastData研究院正式发布了行业报告《2022年度TikTok生态发展白皮书》,...
头部险企如何打造低代码数据集市... 保险业的金融科技建设正在按下快进键,从最新发布的“2022 保险科技创新指数报告”来看...
刷题之-剑指 Offer II... 最近很久没刷题了,面试官给了这么一道题,只给10分钟时间,...
Nginx代理后获取客户端真实... 1、场景 在项目实际应用中,我们可能会需要获取到用户也就是客户端的真实IP地址...
第十三届蓝桥杯省赛 pytho... 文章目录前言主要内容🦞试题 A:排列字母思路代码🦞试题...
阿里春招-2023.3.15-... 极差三元组计数 Problem Description 给定一个数组,请你计算有多少个...
电压放大器在钢筋剥离损伤识别试...   实验名称:钢筋剥离损伤识别试验  研究方向:无损检测  测试目的&#...
MOCO论文前几段精读 MoCo MoCo是CVPR 2020的最佳论文提名,算是视觉领域里,使...
【lua初级篇】基础知识和开发... 文章介绍 文章介绍 简述 工具安装配置和下载 快速看基础知识 一些常用的关键字一览 数据类型 tab...
Yuv422、Nv12转C#B... 1.1、Nv12转Bitmapint w = 1920;int h = 1080;i...
Linux互斥量和信号量的区别... 互斥量和信号量的区别 1.互斥量用于线程的互斥: 互斥:加锁解锁,是指某...
Git 和 GitHub 超入... 1.解决行结束符问题 需要在你的仓库中添加一个.gitattributes文件,标记正...
基于C++的AI五子棋游戏项目... 项目资源下载 基于C++的AI五子棋游戏项目源码压缩包下载地址基于C+...
#浅聊 webSocket (... 如果可以实现记得点赞分享,谢谢老铁~ 一,什么是webso...
Java SE API kno... Java SE API know how 字符串 紧凑字符串 java8 无论字符串的编码ÿ...
常用的VB函数 数学函数函数说明示例Sin(N)返回自变量N的正弦值Sin(0)=0 N为弧度Cos(N)返...