06_Pandas数据合并与对比

数据追加df.append

df.append() 的基本语法:

df.append(self,other,ignore_index=False,verify_integrity=False,sort=False)
  • other:调用方法要追加的DataFrame或类似序列的内容。
  • ignore_index:如果是True,则重新进行自然索引
  • verify_integrity:如果为True,则遇到重复索引内容时报错
  • sort:进行排序

相同结构

直接使用第一个DataFrame的append方法,出入第二个DataFrame。如果需要追加多个DataFrame,可以将它们组成一个列表再传入。

df1 = pd.DataFrame({'x':[1,2],'y':[3,4]})
df2 = pd.DataFrame({'x':[5,6],'y':[7,8]})
df1.append(df2) # 返回一个新的DataFrame

df.append([df2,df3,df,4]) # 追加多个

不同结构

不存在的列会被增加,内容为NaN

df3 = pd.DataFrame({'y':[5,6],'z':[7,8]})
df1.append(df3)

追加序列

append() 除追加DataFrame外,还可以追加一个Series、字典

lily = pd.Series(['lily','c',55,56,57,58],index=['name','team','Q1','Q2','Q3','Q4'])
df = df.append(lily,ignore_index=True)
df = df.append({'name':'lily','team':'c','Q1':55,'Q2':56,'Q3':57,'Q4':58},ignore_index=True)# 同上

数据连接 pd.concat

pd.concat()的基本语法:

pd.concat(objs,axis=0,join='outer',ignore_index=False,
         keys=None,levels=None,names=None,sort=False,
         verify_integrity=False,copy=True)
  • objs:需要连接的数据,可以是多个DataFrame或者Series。必传参数
  • axis:连接的轴方向,默认是0,即按列连接,追加在行后面。值为1时追加到列后面。
  • join:合并方式,其他轴上的数据是按照交集(inner)还是并集(outer)进行合并
  • ignore_index:是否保留远来的索引
  • keys:连接关系
  • names:索引名称,包括多层索引
  • verify_integrity:是否检查重复内容
  • copy:如果为False,则不要深拷贝

## 按列连接

如果要将多个DataFrame按列拼接在一起,指定axis=1。索引无法对应的位置上将填充NaN

df2 = pd.DataFrame({'x':[5,6,7],'y':[7,8,9]})
pd.concat([df1,df2],axis=1)

合并交集

指定参数join=‘inner’,取两个DataFrame的公共部分

# 按列合并交集
pd.concat([df1,df2],axis=1,join='inner')

与序列合并

如同df.append()一样,DataFrame也可以用concat方法与Series合并

z = pd.Series([9,9],name='z')
# 将序列加到新列
pd.concat([df1,z],axis=1)

# 增加新列 效果同上
df1.assign(z=z)

指定索引

可以再给每个表一个一级索引,形成多层索引,这样可以清晰地看到合成后的数据分别来自哪个DataFrame

# 指定索引名
pd.concat([df1,df2],keys=['a','b'])

# 以字典形式传入
pieces = {'a':df1,'b':df2}
pd.concat(pieces)

# 横向合并,指定索引
pd.concat([df1,df2],keys=['a','b'],axis=1)

## 多文件合并

使用python的官方库glob来识别目录文件

import glob

files = glob.glob('data/*.xlsx')
cols = ['ID','时间','名称']
dflist = [pd.read_excel(i,usecols=cols) for i in files]
df = pd.concat(dflist)

df = pd.concat(map(pd.read_excel,glob.glob('data/*.xlsx')))

使用内置函数map进行操作

pd.concat(map(pd.read_csv,['data/d1.csv',
                          'data/d2.csv',
                          'data/d3.csv',]))

pd.concat(map(pd.read_excel,['data/d1.xlsx',
                          'data/d2.xlsx',
                         'data/d3.xlsx',]))

数据合并pd.merge

可以实现类似SQL的join操作,功能更全,性能更优

pd.merge()的基本语法

pd.merge(left,right,how='inner',on=None,left_on=None,right_no=None,
        left_index=False,right_index=False,sort=True,
        suffixes=('_x','_y'),copy=True,indicator=False,
        validate=None) # 返回一个DataFrame
  • left、right:需要连接的两个DataFrame或者Series,一左一右
  • how:两个数据连接方式,默认inner,可以设置为inner、outer、left或right。
  • on:作为连接键的字段,左右数据中都必须存在,否则需要使用left_on和right_on来指定
  • left_index,right_index:为True时,将索引作为连接键
  • suffixes:如果左右数据有重复列,新数据表头会用此后缀进行区分

连接键

在数据连接时,如果没指定哪一列(连接键)进行连接,Pandas会自动找到相同的列名作为连接键。为了代码的可读性和严谨性,推荐通过on参数指定连接键。

df1 = pd.DataFrame({'a':[1,2],'x':[5,6]})
df2 = pd.DataFrame({'a':[2,1,0],'y':[6,7,8]})
pd.merge(df1,df2,on='a')

## 索引连接

可以直接按索引进行连接,将left_index和right_index设置为True,会以两个表的索引作为连接键

pd.merge(df1,df2,left_index=True,right_index=True,suffixes=('_1','_2'))

多连接键

如果在合并数据时需要用多个连接键,可以以列表的形式将这些连接键传入on中

df3 = pd.DataFrame({'a':[1,2],'b':[3,4],'x':[5,6],'z':[10,11]})
df4 = pd.DataFrame({'a':[2,1,0],'b':[3,4,5],'y':[6,7,8]})
pd.merge(df3,df4,on=['a','b'])

连接方法

how参数可以指定数据用哪种方法进行合并,可以设置为inner、outer、left或right,可以实现类似SQL的join操作。

  • inner:取交集
  • left:保留左表所有数据(行)
  • right:保留右表所有数据(行)
  • outer:保留全部数据,对应不上的填充NaN
pd.merge(df3,df4,on=['a','b'],how='left')
pd.merge(df3,df4,on=['a','b'],how='right')
pd.merge(df3,df4,on=['a','b'],how='outer')

连接指示

将indicator设置为True,则会增加名为_merge的列,显示这列是从何而来。_merge列有三个取值:

  • left_only:只在左表
  • right_only:只在右表
  • both:两个表中都有
pd.merge(df3,df4,on='a',how='outer',indicator=True)

按元素合并

df.combine_first()

使用相同位置的值更新空元素,只有在df1有空元素时才能替换值。如果结构不一致,所得DataFrame的行索引和列索引将是两者的并集

df1 = pd.DataFrame({'A':[None,1],'B':[None,2]})
df2 = pd.DataFrame({'A':[3,3],'B':[4,4]})
df1.combine_first(df2)

df3 = pd.DataFrame({'A':[3,3],'C':[4,4]},index=[1,2])
df1.combine_first(df3)

df.combine()

可以与另外一个DataFrame进行按列组合。使用函数通过计算将一个DataFrame与其他DataFrame合并,以逐元素方式合并。所得DataFrame的行、列索引是两者的并集。这个函数中的两个参数,分别是两个df中对应的Series,计算后返回一个Series或者标量

df1=pd.DataFrame({'A':[1,2],'B':[3,4]})
df2=pd.DataFrame({'A':[0,3],'B':[2,1]})
# 合并,方法为:s1和s2对应位置上哪个值大,就返回哪个值
df1.combine(df2,lambda s1,s2:np.where(s1>s2,s1,s2))

df.update

利用update()方法,可以使用来自另一个DataFrame的非NaN值来修改DataFrame,而原DataFrame被更新

df1 = pd.DataFrame({'a':[None,2],'b':[5,6]})
df2 = pd.DataFrame({'a':[0,2],'b':[None,7]})
df1.update(df2)
df1 # 查看结果

数据对比df.compare

在DataFrame上使用compare()传入对比的DataFrame可以进行数据对比(只能对比结构相同的数据)

df1 = pd.DataFrame({'a':[1,2],'b':[5,6]})
df2 = pd.DataFrame({'a':[0,2],'b':[5,7]})
# 对比数据
df1.compare(df2) # 显示数据之间的差异,如果数据没有差异,则显示为NaN

df2 = pd.DataFrame({'a':[1,2],'b':[5,7]})
df1.compare(df2) # a列数据不显示,因为都有相同

传入参数 align_axis=0,可以将不同的数据显示在行方向上

df1 = pd.DataFrame({'a':[1,2],'b':[5,6]})
df2 = pd.DataFrame({'a':[0,2],'b':[5,7]})
df1.compare(df2,align_axis=0) 

方法传入参数keep_equal=True,显示所有数据

df1 = pd.DataFrame({'a':[1,2],'b':[5,6]})
df2 = pd.DataFrame({'a':[0,2],'b':[5,7]})
df1.compare(df2,keep_equal=True) 

方法传入keep_shape=True,可以保持原来的形状,便于查找不同数据的位置

df1 = pd.DataFrame({'a':[1,2],'b':[5,6]})
df2 = pd.DataFrame({'a':[1,2],'b':[5,7]})
df1.compare(df2,keep_shape=True) 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/920971.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从 HTML 到 CSS:开启网页样式之旅(开篇之一)——CSS 初体验与网页样式新征程

从 HTML 到 CSS:开启网页样式之旅(一)——CSS 初体验与网页样式新征程 前言一、为什么需要 CSS?二、CSS的引用(一)行内样式(二)内部样式(三)外部样式&#xf…

Android音频采集

在 Android 开发领域,音频采集是一项非常重要且有趣的功能。它为各种应用程序,如语音聊天、音频录制、多媒体内容创作等提供了基础支持。今天我们就来深入探讨一下 Android 音频采集的两大类型:Mic 音频采集和系统音频采集。 1. Mic音频采集…

数据结构C语言描述4(图文结合)--栈的实现,中序转后序表达式的实现

前言 这个专栏将会用纯C实现常用的数据结构和简单的算法;有C基础即可跟着学习,代码均可运行;准备考研的也可跟着写,个人感觉,如果时间充裕,手写一遍比看书、刷题管用很多,这也是本人采用纯C语言…

数据结构之一:复杂度

相关代码:SData/test_22/main.c Hera_Yc/bit_C_学习 - 码云 - 开源中国 数据结构:在内存当中存储、组织数据的方式。(顺序表、链表、栈、队列、树等)。 算法:与数据结构配合使用,是对数据的处理。&#…

【鸿蒙技术分享:探索 HarmonyOS 开发之旅】

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Houdini和Blender如何使用CPU云渲染

近期,渲染101云渲染农场在产品和服务方面进行了重要更新,进一步提升了我们平台的渲染能力和兼容性,助力各位用户高效完成创作。云渲码6666 渲染101云渲码6666 1. Houdini和Blender支持CPU云渲染 我们不断拓展云渲染的工具和平台支持&#x…

02 —— Webpack 修改入口和出口

概念 | webpack 中文文档 | webpack中文文档 | webpack中文网 修改入口 webpack.config.js (放在项目根目录下) module.exports {//entry设置入口起点的文件路径entry: ./path/to/my/entry/file.js, }; 修改出口 webpack.config.js const path r…

网络编程 作业1

1.c #include <myhead.h> #define IP "192.168.60.45" #define PORT 6666 #define BACKLOG 100 void fun(int sss) {if(sssSIGCHLD){while(waitpid(-1,NULL,0)>0);}} int main(int argc, const char *argv[]) {//1.捕获子进程退出时的信号if(signal(SIGCHL…

【2024亚太杯亚太赛APMCM C题】数学建模竞赛|宠物行业及相关产业的发展分析与策略|建模过程+完整代码论文全解全析

第一个问题是&#xff1a;请基于附件 1 中的数据以及你的团队收集的额外数据&#xff0c;分析过去五年中国宠物行业按宠物类型的发展情况。并分析中国宠物行业发展的因素&#xff0c;预测未来三年中国宠物行业的发展。 第一个问题&#xff1a;分析中国宠物行业按宠物类型的发展…

外排序中的归并排序

外排序中的归并排序 7.11 外排序中的归并排序相关基础知识原理最终参考程序 7.11 外排序中的归并排序 外部排序&#xff1a;数据元素太多不能同时放在内存中&#xff0c;根据排序过程的要求不能在内外存之间移动数据的排序。&#xff08;下文也称外排序&#xff09; 例如 1 G…

wsl2中kali linux下的docker使用教程(教程总结)

一、前言 上一篇关于kali linux的文章是图形界面的配置&#xff0c;这里作者准备补充两点&#xff0c;一点是在使用VNC时&#xff0c;如果F8不能用的话&#xff0c;可以试试AltF8&#xff1b;然后就是VNC在初始化设置时的三个设置选项依次是密码、再输一次以及设置仅观看密码。…

Linux系统使用valgrind分析C++程序内存资源使用情况

内存占用是我们开发的时候需要重点关注的一个问题&#xff0c;我们可以人工根据代码推理出一个消耗内存较大的函数&#xff0c;也可以推理出大概会消耗多少内存&#xff0c;但是这种方法不仅麻烦&#xff0c;而且得到的只是推理的数据&#xff0c;而不是实际的数据。 我们可以…

【通俗理解】ELBO(证据下界)——机器学习中的“情感纽带”

【通俗理解】ELBO&#xff08;证据下界&#xff09;——机器学习中的“情感纽带” 关键词提炼 #ELBO #证据下界 #变分推断 #机器学习 #潜变量模型 #KL散度 #期望 #对数似然 第一节&#xff1a;ELBO的类比与核心概念【尽可能通俗】 ELBO&#xff0c;即证据下界&#xff0c;在…

【pyspark学习从入门到精通14】MLlib_1

目录 包的概览 加载和转换数据 在前文中&#xff0c;我们学习了如何为建模准备数据。在本文中&#xff0c;我们将实际使用这些知识&#xff0c;使用 PySpark 的 MLlib 包构建一个分类模型。 MLlib 代表机器学习库。尽管 MLlib 现在处于维护模式&#xff0c;即它不再积极开发…

业务架构、数据架构、应用架构和技术架构

TOGAF(The Open Group Architecture Framework)是一个广泛应用的企业架构框架&#xff0c;旨在帮助组织高效地进行架构设计和管理。 TOGAF 的核心就是由我们熟知的四大架构领域组成:业务架构、数据架构、应用架构和技术架构。 企业数字化架构设计中的最常见要素是4A 架构。 4…

阿里巴巴官方「SpringCloudAlibaba全彩学习手册」限时开源!

最近我在知乎上看过的一个热门回答&#xff1a; 初级 Java 开发面临的最大瓶颈在于&#xff0c;脱离不出自身业务带来的局限。日常工作中大部分时间在增删改查、写写接口、改改 bug&#xff0c;久而久之就会发现&#xff0c;自己的技术水平跟刚工作时相比没什么进步。 所以我们…

后端数据增删改查基于Springboot+mybatis mysql 时间根据当时时间自动填充,数据库连接查询不一致,mysql数据库连接不好用

目录 后端数据增删改查Springboot 实体&#xff08;entity&#xff09;类引进添加UserMapper接口 创建对用的UserController注意数据库查询不一致新增数据更新删除postman测试 后端数据增删改查 基于之前构建系统&#xff0c;实现用户数据的CRUD。 打开navicat16&#xff0c;…

堆外内存泄露排查经历

优质博文&#xff1a;IT-BLOG-CN 一、问题描述 淘宝后台应用从今年某个时间开始docker oom的量突然变多&#xff0c;确定为堆外内存泄露。 后面继续按照上一篇对外内存分析方法的进行排查(jemalloc、pmap、mallocpmap/mapsNMTjstackgdb)&#xff0c;但都没有定位到问题。至于…

WebSocket详解、WebSocket入门案例

目录 1.1 WebSocket介绍 http协议&#xff1a; webSocket协议&#xff1a; 1.2WebSocket协议&#xff1a; 1.3客户端&#xff08;浏览器&#xff09;实现 1.3.2 WebSocket对象的相关事宜&#xff1a; 1.3.3 WebSOcket方法 1.4 服务端实现 服务端如何接收客户端发送的请…

Vue3 源码解析(三):静态提升

什么是静态提升 Vue3 尚未发布正式版本前&#xff0c;尤大在一次关于 Vue3 的分享中提及了静态提升&#xff0c;当时笔者就对这个亮点产生了好奇&#xff0c;所以在源码阅读时&#xff0c;静态提升也是笔者的一个重点阅读点。 那么什么是静态提升呢&#xff1f;当 Vue 的编译器…