【Python】详解pandas库中pd.merge函数与代码示例

在这里插入图片描述

😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。
🤓 同时欢迎大家关注其他专栏,我将分享Web前后端开发、人工智能、机器学习、深度学习从0到1系列文章。
🌼 同时洲洲已经建立了程序员技术交流群,如果您感兴趣,可以私信我加入社群,可以直接vx联系(文末有名片)v:bdizztt
🖥 随时欢迎您跟我沟通,一起交流,一起成长、进步!点此也可获得联系方式~

本文目录

  • 前言
  • 一、pd.merge()函数简介
  • 二、代码场景示例
    • 示例1:基于单个键的内连接
    • 示例2:基于多个键的外连接
    • 示例3:使用索引进行合并
    • 示例4:处理重复的列名
  • 三、实战案例
    • 1、基础数据
    • 2、传入的on的参数是列表
    • 3、Merge method组合
    • 4、传入indicator参数
    • 5、index为链接键
    • 6、sort对链接的键值进行排序
  • 注意事项
  • 总结

前言

在数据科学和分析领域,经常需要处理来自不同源的数据集,并将它们合并为一个统一的数据结构以进行进一步的分析。Pandas库中的pd.merge()函数提供了一种灵活的方式来合并两个或多个DataFrame,类似于SQL中的JOIN操作。本文将详细介绍pd.merge()函数的用法,并通过多个代码示例展示其在不同场景下的应用。

一、pd.merge()函数简介

pd.merge()函数用于根据一个或多个键将不同的数据集合并成一个DataFrame。它非常类似于SQL中的JOIN操作。

pd.merge(left, right, how='inner', on=None, left_on=None, 
		right_on=None,left_index=False, right_index=False, 
		sort=True,suffixes=('_x', '_y'), copy=True,
		 indicator=False,validate=None)

参数含义说明如下:

  • left: 拼接的左侧DataFrame对象
  • right: 拼接的右侧DataFrame对象
  • on: 要加入的列或索引级别名称。 必须在左侧和右侧DataFrame对象中找到。 如果未传递且left_index和right_index为False,则DataFrame中的列的交集将被推断为连接键。
  • left_on:左侧DataFrame中的列或索引级别用作键。 可以是列名,索引级名称,也可以是长度等于DataFrame长度的数组。
  • right_on: 左侧DataFrame中的列或索引级别用作键。 可以是列名,索引级名称,也可以是长度等于DataFrame长度的数组。
  • left_index: 如果为True,则使用左侧DataFrame中的索引(行标签)作为其连接键。 对于具有MultiIndex(分层)的DataFrame,级别数必须与右侧DataFrame中的连接键数相匹配。
  • right_index: 与left_index功能相似。
  • how: One of ‘left’, ‘right’, ‘outer’, ‘inner’. 默认inner。inner是取交集,outer取并集。比如left:[‘A’,‘B’,‘C’];right[’'A,‘C’,‘D’];inner取交集的话,left中出现的A会和right中出现的买一个A进行匹配拼接,如果没有是B,在right中没有匹配到,则会丢失。'outer’取并集,出现的A会进行一一匹配,没有同时出现的会将缺失的部分添加缺失值。
  • sort: 按字典顺序通过连接键对结果DataFrame进行排序。 默认为True,设置为False将在很多情况下显着提高性能。
  • suffixes: 用于重叠列的字符串后缀元组。 默认为(‘x’,’ y’)。
  • copy: 始终从传递的DataFrame对象复制数据(默认为True),即使不需要重建索引也是如此。
  • indicator:将一列添加到名为_merge的输出DataFrame,其中包含有关每行源的信息。 _merge是分类类型,并且对于其合并键仅出现在“左”DataFrame中的观察值,取得值为left_only,对于其合并键仅出现在“右”DataFrame中的观察值为right_only,并且如果在两者中都找到观察点的合并键,则为left_only。

二、代码场景示例

示例1:基于单个键的内连接

假设有两个DataFrame,df1和df2,它们有一个共同的列’key’:

import pandas as pd

# 创建两个示例DataFrame
df1 = pd.DataFrame({'key': ['A', 'B', 'C'], 'value': [1, 2, 3]})
df2 = pd.DataFrame({'key': ['A', 'B', 'D'], 'value2': [4, 5, 6]})

# 使用'key'列进行合并
result = pd.merge(df1, df2, on='key')

print(result)

示例2:基于多个键的外连接

使用left_on和right_on参数基于多个列进行合并:

# 扩展示例DataFrame
df1 = pd.DataFrame({'key1': ['K0', 'K1', 'K2'], 'key2': ['K0', 'K1', 'K2'], 'value': [1, 2, 3]})
df2 = pd.DataFrame({'key1': ['K0', 'K1', 'K1'], 'key2': ['K0', 'K0', 'K0'], 'value2': [4, 5, 6]})

# 使用how='outer'进行外连接
result = pd.merge(df1, df2, how='outer', left_on=['key1', 'key2'], right_on=['key1', 'key2'])

print(result)

示例3:使用索引进行合并

使用DataFrame的索引作为合并键:

# 假设df1和df2的索引可以用于合并
df1 = pd.DataFrame({'value': [1, 2, 3]}, index=['A', 'B', 'C'])
df2 = pd.DataFrame({'value2': [4, 5, 6]}, index=['A', 'B', 'D'])

# 使用索引进行合并
result = pd.merge(df1, df2, left_index=True, right_index=True)

print(result)

示例4:处理重复的列名

当两个DataFrame有重复的列名但不是合并键时,可以使用suffixes参数:

df1 = pd.DataFrame({'value': [1, 2, 3], 'key': ['A', 'B', 'C']})
df2 = pd.DataFrame({'value2': [4, 5, 6], 'key': ['A', 'B', 'D']})

# 使用suffixes区分重复的列名
result = pd.merge(df1, df2, on='key', suffixes=('_left', '_right'))

print(result)

三、实战案例

1、基础数据

import pandas as pd

left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                       'A': ['A0', 'A1', 'A2', 'A3'],
                       'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                        'C': ['C0', 'C1', 'C2', 'C3'],
                        'D': ['D0', 'D1', 'D2', 'D3']})
result = pd.merge(left, right, on='key')

# on参数传递的key作为连接键
result
Out[4]: 
    A   B key   C   D
0  A0  B0  K0  C0  D0
1  A1  B1  K1  C1  D1
2  A2  B2  K2  C2  D2
3  A3  B3  K3  C3  D3

2、传入的on的参数是列表

left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
                      'key2': ['K0', 'K1', 'K0', 'K1'],
                         'A': ['A0', 'A1', 'A2', 'A3'],
                         'B': ['B0', 'B1', 'B2', 'B3']})

right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
                      'key2': ['K0', 'K0', 'K0', 'K0'],
                         'C': ['C0', 'C1', 'C2', 'C3'],
                         'D': ['D0', 'D1', 'D2', 'D3']})

result = pd.merge(left, right, on=['key1', 'key2'])
# 同时传入两个Key,此时会进行以['key1','key2']列表的形式进行对应,left的keys列表是:[['K0', 'K0'],['K0', 'K1'],['K1', 'K0'],['K2', 'K1']],
left的keys列表是:[['K0', 'K0'],['K1', 'K0'],['K1', 'K0'],['K2', 'K0']],因此会有1['K0', 'K0']2['K1', 'K0']对应。

result
Out[6]: 
    A   B key1 key2   C   D
0  A0  B0   K0   K0  C0  D0
1  A2  B2   K1   K0  C1  D1
2  A2  B2   K1   K0  C2  D2

3、Merge method组合

需要注意:如果组合键没有出现在左表或右表中,则连接表中的值将为NA。
在这里插入图片描述

result = pd.merge(left, right, how='left', on=['key1', 'key2'])
# Use keys from left frame only
result
Out[34]: 
    A   B key1 key2    C    D
0  A0  B0   K0   K0   C0   D0
1  A1  B1   K0   K1  NaN  NaN
2  A2  B2   K1   K0   C1   D1
3  A2  B2   K1   K0   C2   D2
4  A3  B3   K2   K1  NaN  NaN

result = pd.merge(left, right, how='right', on=['key1', 'key2'])
# Use keys from right frame only
result
Out[36]: 
     A    B key1 key2   C   D
0   A0   B0   K0   K0  C0  D0
1   A2   B2   K1   K0  C1  D1
2   A2   B2   K1   K0  C2  D2
3  NaN  NaN   K2   K0  C3  D3

result = pd.merge(left, right, how='outer', on=['key1', 'key2'])
# Use intersection of keys from both frames 
result
Out[38]: 
     A    B key1 key2    C    D
0   A0   B0   K0   K0   C0   D0
1   A1   B1   K0   K1  NaN  NaN
2   A2   B2   K1   K0   C1   D1
3   A2   B2   K1   K0   C2   D2
4   A3   B3   K2   K1  NaN  NaN
5  NaN  NaN   K2   K0   C3   D3
-----------------------------------------------------
left = pd.DataFrame({'A' : [1,2], 'B' : [2, 2]})
right = pd.DataFrame({'A' : [4,5,6], 'B': [2,2,2]})
result = pd.merge(left, right, on='B', how='outer')
result
Out[40]: 
   A_x  B  A_y
0    1  2    4
1    1  2    5
2    1  2    6
3    2  2    4
4    2  2    5
5    2  2    6

4、传入indicator参数

merge接受参数指示符。 如果为True,则将名为_merge的Categorical类型列添加到具有值的输出对象:
在这里插入图片描述

df1 = pd.DataFrame({'col1': [0, 1], 'col_left':['a', 'b']})
df2 = pd.DataFrame({'col1': [1, 2, 2],'col_right':[2, 2, 2]})
pd.merge(df1, df2, on='col1', how='outer', indicator=True)

Out[44]: 
   col1 col_left  col_right      _merge
0   0.0        a        NaN   left_only
1   1.0        b        2.0        both
2   2.0      NaN        2.0  right_only
3   2.0      NaN        2.0  right_only

指标参数也将接受字符串参数,在这种情况下,指标函数将使用传递的字符串的值作为指标列的名称。

pd.merge(df1, df2, on='col1', how='outer', indicator='indicator_column')
Out[45]: 
   col1 col_left  col_right indicator_column
0   0.0        a        NaN        left_only
1   1.0        b        2.0             both
2   2.0      NaN        2.0       right_only
3   2.0      NaN        2.0       right_only

5、index为链接键

需要同时设置left_index= True 和 right_index= True,或者left_index设置的同时,right_on指定某个Key。总的来说就是需要指定left、right链接的键,可以同时是key、index或者混合使用。

left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
   ....:                      'B': ['B0', 'B1', 'B2']},
   ....:                      index=['K0', 'K1', 'K2'])
   ....: 
right = pd.DataFrame({'C': ['C0', 'C2', 'C3'],
   ....:                       'D': ['D0', 'D2', 'D3']},
   ....:                       index=['K0', 'K2', 'K3'])
   ....: 

# 只有K0、K2有对应的值
pd.merge(left,right,how= 'inner',left_index=True,right_index=True)
Out[51]: 
     A   B   C   D
K0  A0  B0  C0  D0
K2  A2  B2  C2  D2


left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                     'B': ['B0', 'B1', 'B2', 'B3'],
                   'key': ['K0', 'K1', 'K0', 'K1']})


right = pd.DataFrame({'C': ['C0', 'C1'],
                      'D': ['D0', 'D1']},
                    index=['K0', 'K1'])


result = pd.merge(left, right, left_on='key', right_index=True, how='left', sort=False)
#  left_on='key', right_index=True
result
Out[54]: 
    A   B key   C   D
0  A0  B0  K0  C0  D0
1  A1  B1  K1  C1  D1
2  A2  B2  K0  C0  D0
3  A3  B3  K1  C1  D1

6、sort对链接的键值进行排序

紧接着上一例,设置sort= True
result = pd.merge(left, right, left_on='key', right_index=True, how='left', sort=True)

result
Out[57]: 
    A   B key   C   D
0  A0  B0  K0  C0  D0
2  A2  B2  K0  C0  D0
1  A1  B1  K1  C1  D1
3  A3  B3  K1  C1  D1

注意事项

合并方式:根据数据的需求选择合适的合并方式(‘inner’, ‘outer’, ‘left’, ‘right’)。

数据一致性:确保合并键的数据类型在两个DataFrame中是一致的。

索引使用:如果使用索引作为合并键,确保索引是有意义的,且在两个DataFrame中都是唯一的。

性能问题:对于大型DataFrame,合并操作可能会消耗较多资源,考虑优化数据或使用数据库处理。

重复列名:使用suffixes参数来区分合并后重复的列名。

总结

📝Hello,各位看官老爷们好,我已经建立了CSDN技术交流群,如果你很感兴趣,可以私信我加入我的社群。

📝社群中不定时会有很多活动,例如每周都会包邮免费送一些技术书籍及精美礼品、学习资料分享、大厂面经分享、技术讨论谈等等。

📝社群方向很多,相关领域有Web全栈(前后端)、人工智能、机器学习、自媒体副业交流、前沿科技文章分享、论文精读等等。

📝不管你是多新手的小白,都欢迎你加入社群中讨论、聊天、分享,加速助力你成为下一个大佬!

📝想都是问题,做都是答案!行动起来吧!欢迎评论区or后台与我沟通交流,也欢迎您点击下方的链接直接加入到我的交流社群!~ 跳转链接社区~

在这里插入图片描述

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

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

相关文章

高考志愿填报秘籍:个人篇

选择适合自己的大学和专业,对广大考生来说至关重要。从某种程度上来说,决定了考生未来所从事的行业和发展前景。为了帮助广大考生更加科学、合理地填报志愿,选择适合自己的大学和专业,本公众号将推出如何用AI填报高考志愿专栏文章…

清远mes系统开发商 盈致科技

清远MES系统开发商盈致科技为企业提供专业的MES系统解决方案,帮助企业实现生产过程的数字化管理和优化。盈致科技的服务范围包括但不限于以下方面:MES系统定制开发:盈致科技可以根据清远企业的实际需求定制开发适合的MES系统,满足…

defer关键字

【1】defer关键字的作用: 在函数中,程序员经常需要创建资源,为了在函数执行完毕后,及时的释放资源,Go的设计者提供defer关键字 【2】案例展示: 【3】代码变动一下,再次看结果: 发…

智慧大屏是如何实现数据可视化的?

智慧大屏,作为数据可视化的重要载体,已在城市管理、交通监控、商业运营等领域广泛应用。本文旨在阐述智慧大屏实现数据可视化的关键技术和方法,包括数据源管理、数据处理、视觉编码、用户界面与交互设计等。 大屏通过接入企业内部的数据库系…

openlayers 绘图功能,编辑多边形,modify组件的使用(三)

前两篇介绍了 openlayers 中 draw 的使用,自定义了绘制中和绘制结束后的样式,绘制结束后可以获取到绘制图形的featue或者进一步获取轮廓坐标(如下),可以进行坐标保存或者将feature添加到其他层进一步自定义显示 draw.value.on("drawend…

arxiv提交报错解决指南

- 编译时无错误 - 所有文件和图片文件都在同一目录下 - 生成.bbl文件 overleaf将参考文献格式bib转bbl(bibitem)_overleaf bbl文件-CSDN博客 - .tex文件、.bib文件、.bbl文件 的文件名要一致,修改.bib文件名记得在.tex文件中修改bibliograp…

如何导出数据库中数据表或查询结果的数据:支持大数据量(以MySQL和SQLynx为例)

MySQL的数据导出是一个操作非常频繁的任务,也是数据的存储和传输比较重要的一种方式,本文主要以SQLynx为例来介绍MySQL的数据如何导出。 目录 1 操作步骤 步骤 1:登录SQLynx 步骤 2:选择数据库和表 步骤 3:执行查询…

BL104钡铼多协议采集网关助力企业智能化转型

BL104钡铼多协议采集网关(PLC物联网关BL104)是为满足工业环境需求而设计的专业工业级协议转换网关。它在企业智能化转型过程中扮演着关键角色,为企业提供了高效、稳定的通信解决方案,助力企业实现智能化转型。 首先,P…

【Linux】运维-Kubernetes(k8s)应用介绍及使用-了解

一、介绍 Kubernetes,也被称为K8s或Kube,是谷歌推出的业界最受欢迎的容器编排器。 K8s是一个架构良好的分布式系统的例子。它将集群中的所有机器都视为单个资源池的一部分。 K8s与其他成熟的分布式系统一样,有两层:头节点和工作节…

opencv-python(八)

import cv2 import numpy as npheight 160 width 280 image np.zeros((height, width),np.uint8) cv2.imshow(image,image) cv2.waitKeyEx(0) cv2.destroyAllWindows() 二维数组代表一幅灰度图像。 import cv2 import numpy as npheight 160 width 280 image np.zeros((he…

什么是无头浏览器以及其工作原理?

如果您对这个概念还不熟悉,那么使用无头网络浏览器的想法可能会让您感到不知所措。无头浏览器本质上与您熟悉的网络浏览器相同,但有一个关键区别:它们没有图形用户界面 (GUI)。这意味着没有按钮、选项卡、地址栏或视觉显示。 相反&#xff0c…

译译交友项目介绍

一、 项目背景 随着社会的进步,英语作为一种国际语言,很多人都在学习英语,然而现在很多人都会因为学习英语而烦恼,有时还会因为是一个人学习而感到枯燥。面对情绪的低落,往往会使学习更困难。因此,我打造了…

2024 AI智算产业趋势,数据智能时代的到来(免费下载)

【1】关注公众号<方案驿站> 【2】私信发送 2024AI智算产业趋势展望 【3】获取本方案PDF下载链接&#xff0c;直接下载即可。 如需下载本方案PPT/WORD原格式&#xff0c;诚挚邀请您微信扫描以下二维码加入方案驿站知识星球&#xff0c;获取上万份PPT/WORD解决方案&…

Ubuntu系统中网易云音乐编译安装

项目地址&#xff1a; netease-cloud-music-gtk: Linux 平台下基于 Rust GTK 开发的网易云音乐播放器 目录 1.README.md中按照步骤来 2.安装git 3.报错 sudo apt install cmake sudo apt-get install libdbus-1-dev sudo apt install dnf sudo dnf install gettext 继…

2024年山西泵管阀展览会11月8日开展

2024中国&#xff08;山西&#xff09;国际水务科技博览会 暨水处理技术设备与泵管阀展览会 时间&#xff1a;2024年11月8-10日 地点&#xff1a;山西潇河国际会展中心 经研究&#xff0c;由山西省水处理行业协会、山西省水暖阀门商会、山西省固废产业协会联合主办的2024…

防火墙安全管理

大多数企业通过互联网传输关键数据&#xff0c;因此部署适当的网络安全措施是必要的&#xff0c;拥有足够的网络安全措施可以为网络基础设施提供大量的保护&#xff0c;防止黑客、恶意用户、病毒攻击和数据盗窃。 网络安全结合了多层保护来限制恶意用户&#xff0c;并仅允许授…

教你一段代码激活计算机系统

方法简单粗暴&#xff0c;再也不用遭受未激活的烦恼了&#xff01; 新建文本 输入代码&#xff0c;把文件后缀.txt改.bat slmgr /skms kms.03k.org slmgr /ato

m4a怎么转换成m4r格式?

之前给大家分享过“m4a转mp3”教程文章&#xff0c;今天继续分享有关m4a的格式转换方法。想必大家对m4a格式已经了解的差不多了&#xff0c;苹果手机的专属格式。那么大家知道m4r格式吗? 从名字就可以看出来&#xff0c;它和m4a格式肯定有着密切的联系和相似点。m4r是iPhone铃…

GUI编程03-事件监听

事件监听是指当某个事件发生的时候干一些什么。 例如之前在关闭frame窗口时就写过一个window窗口监听&#xff0c;当点击左上角❌时调用System.exit进行程序关闭。 1.按钮监听 下面的例子是监听按钮Button被点击时触发的事件 同时我们将窗口关闭监听事件进行了优化&#xff…

每日一练:攻防世界:base64stego

base64stego&#xff1a; 打开压缩包发现被加密&#xff0c;用winhex查看&#xff0c;发现是伪加密&#xff0c;修改文件目录区的全局方式位标记&#xff0c;成功打开压缩包&#xff0c;得到一个文本 这里我想的有三种情况&#xff1a;1.直接base64解码&#xff0c;然后看解码…