百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

Python数据处理:merge让数据连接与合并更高效「附源码」

bigegpt 2024-08-16 14:18 2 浏览

前言:

Pandas 的基本特性之一就是高性能的内存式数据连接(join)与合并(merge)操作。pd.merge() 函数实现了三种数据连接的类型:一对一、多对一和多对多。这三种数据连接 类型都通过 pd.merge() 接口进行调用,根据不同的数据连接需求进行不同的操作。

一、数据连接的类型

1.一对一连接

一对一连接是最简单的数据合并类型。

df1= pd.DataFrame({'员工': ['Bob', 'Jake', 'Lisa', 'Sue'],
 '组': ['Accounting', 'Engineering', 'Engineering', 'HR']})
df2= pd.DataFrame({'员工': ['Lisa', 'Bob', 'Jake', 'Sue'],
 '入职': [2004, 2008, 2012, 2014]})

上次讲解了怎么用concat函数合并成一个DataFrame,下面使用pd.merge函数实现。

df3= pd.merge(df1, df2)
df3

?代码结果:


pd.merge() 方法会发现两个 DataFrame 都有“员工”这一列,并会自动以这列作为键进行连接。两个输入的合并结果是一个新的 DataFrame。需要注意的是共同列的位置可以是不一致的。

2. 多对一连接

多对一连接是指,在需要连接的两个列中,有一列的值有重复。通过多对一连接获得的结果 DataFrame 将会保留重复值。

df4= pd.DataFrame({'组': ['Accounting', 'Engineering', 'HR'],
 '管理组': ['Carly', 'Guido', 'Steve']})
pd.merge(df1,df4)

??代码结果:


在结果 DataFrame 中多了一个“管理组”列,里面有些值会因为输入数据的对应关系而有所重复。

3. 多对多连接

多对多连接是个有点儿复杂的概念,如果左右两个输入的共同列都包含重复值,那么合并的结果就是一种多对多连接。

df5= pd.DataFrame({'组': ['Accounting', 'Accounting',
 'Engineering', 'Engineering', 'HR', 'HR'],
 '技能': ['math', 'spreadsheets', 'coding', 'linux',
 'spreadsheets', 'organization']})
pd.merge(df1, df5)

??代码结果:

这三种数据连接类型可以直接与其他 Pandas 工具组合使用,从而实现各种各样的功能。但是工作中的真实数据集往往并不像示例中演示的那么干净、整洁。

二、设置数据合并的键

1.参数on的用法

最简单的方法就是直接将参数 on 设置为一个列名字符串或者一个包含多列名称的列表。

pd.merge(df1, df2, on='员工')

?代码结果:?

这个参数只能在两个 DataFrame 有共同列名的时候才可以使用。

2.left_on与right_on参数

有时候要合并两个列名不同的数据集,就可以用 left_on 和 right_on 参数来指定列名。

df7= pd.DataFrame({'名字': ['Bob', 'Jake', 'Lisa', 'Sue'],
 '薪水': [70000, 80000, 120000, 90000]})
pd.merge(df1, df7, left_on="员工", right_on="名字")

?代码结果:?

获取的结果中会有一个多余的列,可以通过 DataFrame 的 drop() 方法将这列去掉。

pd.merge(df1, df3, left_on="员工", right_on="名字").drop('名字', axis=1)
?组

?代码结果:

3.left_index与right_index参数

除了合并列之外,你可能还需要合并索引。

df1a= df1.set_index('员工')
df2a= df2.set_index('员工')
print(df1a)
print(df2a)

?代码结果:

员工 组 
Bob Accounting
Jake Engineering
Lisa Engineering
Sue HR
 
员工 入职 
Lisa 2004
Bob 2008
Jake 2012
Sue 2014

以通过设置 pd.merge() 中的 left_index 和 / 或 right_index 参数将索引设置为键来实现合并。

pd.merge(df1a, df2a, left_index=True, right_index=True,)

??代码结果:

4.用 join() 方法:按照索引进行数据合并

df1a.join(df2a)

??代码结果:

如果想将索引与列混合使用,那么可以通过结合 left_index 与 right_on,或者结合 left_ on 与 right_index 来实现

pd.merge(df1a, df3, left_index=True, right_on='名字')

?代码结果:?

三、设置数据连接的集合操作规则

集合操作规则:当一个值出现在一列,却没有出现在另一列时,就需要考虑集合操作规则了。

df8= pd.DataFrame({'名字': ['Peter', 'Paul', 'Mary'],
 '食物': ['fish', 'beans', 'bread']},
 columns=['名字', '食物'])
df9= pd.DataFrame({'名字': ['Mary', 'Joseph'],
 '酒': ['wine', 'beer']},
 columns=['名字', '酒'])
pd.merge(df8, df9)

??代码结果:

在合并这两个数据集时,在“名字”列中只有一个共同的值,结果中只会包含两个集合的交集。

1.外连接(outer join):返回两个输入列的交集,所有缺失值都用 NaN 填充。

pd.merge(df8, df9, how='outer')

??代码结果:

2.左连接(left join)和右连接(right join):返回的结果分别只包含左列和右列。

pd.merge(df8, df9, how='right')

??代码结果:

现在输出的行中只包含右边输入列的值。

pd.merge(df8, df9, how='left')

??代码结果:

现在输出的行中只包含左边输入列的值。

3.重复列名:suffixes参数

你有时候可能会遇到两个输入 DataFrame 有重名列的情况。

df8a= pd.DataFrame({'名字': ['Bob', 'Jake', 'Lisa', 'Sue'],
 '排名': [1, 2, 3, 4]})
df9b= pd.DataFrame({'名字': ['Bob', 'Jake', 'Lisa', 'Sue'],
 '排名': [3, 1, 4, 2]})
pd.merge(df8a, df9b, on="名字")

??代码结果:

由于输出结果中有两个重复的列名,因此 pd.merge() 函数会自动为它们增加后缀 _x 或 _y, 当然也可以通过 suffixes 参数自定义后缀名。

pd.merge(df8a, df9b, on="名字", suffixes=["_L", "_R"])

?代码结果:

suffixes 参数同样适用于任何连接方式,即使有三个及三个以上的重复列名时也同样适用。

相关推荐

了解Linux目录,那你就了解了一半的Linux系统

大到公司或者社群再小到个人要利用Linux来开发产品的人实在是多如牛毛,每个人都用自己的标准来配置文件或者设置目录,那么未来的Linux则就是一团乱麻,也对管理造成许多麻烦。后来,就有所谓的FHS(F...

Linux命令,这些操作要注意!(linux命令?)

刚玩Linux的人总觉得自己在演黑客电影,直到手滑输错命令把公司服务器删库,这才发现命令行根本不是随便乱用的,而是“生死簿”。今天直接上干货,告诉你哪些命令用好了封神!喜欢的一键三连,谢谢观众老爷!!...

Linux 命令速查手册:这 30 个高频指令,拯救 90% 的运维小白!

在Linux系统的世界里,命令行是强大的武器。对于运维小白而言,掌握一些高频使用的Linux命令,能极大提升工作效率,轻松应对各种系统管理任务。今天,就为大家奉上精心整理的30个Linu...

linux必学的60个命令(linux必学的20个命令)

以下是Linux必学的20个基础命令:1.cd:切换目录2.ls:列出文件和目录3.mkdir:创建目录4.rm:删除文件或目录5.cp:复制文件或目录6.mv:移动/重命名文件或目录7....

提高工作效率的--Linux常用命令,能够决解95%以上的问题

点击上方关注,第一时间接受干货转发,点赞,收藏,不如一次关注评论区第一条注意查看回复:Linux命令获取linux常用命令大全pdf+Linux命令行大全pdf为什么要学习Linux命令?1、因为Li...

15 个实用 Linux 命令(linux命令用法及举例)

Linux命令行是系统管理员、开发者和技术爱好者的强大工具。掌握实用命令不仅能提高效率,还能解锁Linux系统的无限潜力,本文将深入介绍15个实用Linux命令。ls-列出目录内容l...

Linux 常用命令集合(linux常用命令全集)

系统信息arch显示机器的处理器架构(1)uname-m显示机器的处理器架构(2)uname-r显示正在使用的内核版本dmidecode-q显示硬件系统部件-(SMBIOS/DM...

Linux的常用命令就是记不住,怎么办?

1.帮助命令1.1help命令#语法格式:命令--help#作用:查看某个命令的帮助信息#示例:#ls--help查看ls命令的帮助信息#netst...

Linux常用文件操作命令(linux常用文件操作命令有哪些)

ls命令在Linux维护工作中,经常使用ls这个命令,这是最基本的命令,来写几条常用的ls命令。先来查看一下使用的ls版本#ls--versionls(GNUcoreutils)8.4...

Linux 常用命令(linux常用命令)

日志排查类操作命令查看日志cat/var/log/messages、tail-fxxx.log搜索关键词grep"error"xxx.log多条件过滤`grep-E&#...

简单粗暴收藏版:Linux常用命令大汇总

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部下午好,我的网工朋友在Linux系统中,命令行界面(CLI)是管理员和开发人员最常用的工具之一。通过命令行,用户可...

「Linux」linux常用基本命令(linux常用基本命令和用法)

Linux中许多常用命令是必须掌握的,这里将我学linux入门时学的一些常用的基本命令分享给大家一下,希望可以帮助你们。总结送免费学习资料(包含视频、技术学习路线图谱、文档等)1、显示日期的指令:d...

Linux的常用命令就是记不住,怎么办?于是推出了这套教程

1.帮助命令1.1help命令#语法格式:命令--help#作用:查看某个命令的帮助信息#示例:#ls--help查看ls命令的帮助信息#netst...

Linux的30个常用命令汇总,运维大神必掌握技能!

以下是Linux系统中最常用的30个命令,精简版覆盖日常操作核心需求,适合快速掌握:一、文件/目录操作1.`ls`-列出目录内容`ls-l`(详细信息)|`ls-a`(显示隐藏文件)...

Linux/Unix 系统中非常常用的命令

Linux/Unix系统中非常常用的命令,它们是进行文件操作、文本处理、权限管理等任务的基础。下面是对这些命令的简要说明:**文件操作类:*****`ls`(list):**列出目录内容,显...