Pandas数据合并:concat与merge

目录

一、concat方法

1. 基本语法

2. 示例

示例1:按行合并(垂直方向)

示例2:按列合并(水平方向)

示例3:使用join='inner'进行内连接

示例4:处理列名冲突

二、merge方法

1. 基本语法

2. 示例

示例1:内连接(Inner Join)

示例2:外连接(Outer Join)

示例3:左连接(Left Join)

示例4:右连接(Right Join)

示例5:基于多个键的合并

总结


在数据处理和分析的过程中,数据合并是一个常见且重要的步骤。Pandas作为Python中强大的数据处理库,提供了多种数据合并的方法,其中concat和merge是两种最常用的方法。本文将通过实例和代码详细讲解这两种方法的使用,帮助读者掌握它们在实际应用中的技巧。

一、concat方法

concat函数用于沿着一个特定的轴(行或列)将多个Pandas对象(如DataFrame或Series)连接在一起。它是一种简单的拼接方式,适用于多种场景,例如将不同时间段的数据纵向堆叠,或者将具有相同索引的不同特征横向拼接。

1. 基本语法

pandas.concat(objs, axis=0, join='outer', ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=False, copy=True)
  • objs:要连接的对象列表,可以是DataFrame或Series。
  • axis:指定连接的方向,默认为0,表示按行连接;1表示按列连接。
  • join:控制连接时如何处理索引对齐。可选值有'inner'(取交集)和'outer'(取并集),默认为'outer'。
  • ignore_index:如果设置为True,则忽略原始索引,重新生成新的整数索引。

其他参数主要用于高级用法,如添加层次化索引等。

2. 示例

示例1:按行合并(垂直方向)
import pandas as pd# 创建两个DataFrame
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],'B': ['B0', 'B1', 'B2', 'B3'],'C': ['C0', 'C1', 'C2', 'C3'],'D': ['D0', 'D1', 'D2', 'D3']
}, index=[0, 1, 2, 3])df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],'B': ['B4', 'B5', 'B6', 'B7'],'C': ['C4', 'C5', 'C6', 'C7'],'D': ['D4', 'D5', 'D6', 'D7']
}, index=[4, 5, 6, 7])# 按行合并df1和df2
result = pd.concat([df1, df2])
print(result)

输出:

A   B   C   D
0  A0  B0  C0  D0
1  A1  B1  C1  D1
2  A2  B2  C2  D2
3  A3  B3  C3  D3
4  A4  B4  C4  D4
5  A5  B5  C5  D5
6  A6  B6  C6  D6
7  A7  B7  C7  D7
示例2:按列合并(水平方向)
# 创建两个DataFrame
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],'B': ['B0', 'B1', 'B2', 'B3']
}, index=[0, 1, 2, 3])df2 = pd.DataFrame({'C': ['C0', 'C1', 'C2', 'C3'],'D': ['D0', 'D1', 'D2', 'D3']
}, index=[0, 1, 2, 3])# 按列合并df1和df2
result = pd.concat([df1, df2], axis=1)
print(result)

输出:

A   B   C   D
0  A0  B0  C0  D0
1  A1  B1  C1  D1
2  A2  B2  C2  D2
3  A3  B3  C3  D3
示例3:使用join='inner'进行内连接
# 创建两个DataFrame
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],'B': ['B0', 'B1', 'B2', 'B3']
}, index=[0, 1, 2, 3])df2 = pd.DataFrame({'B': ['B4', 'B5', 'B6', 'B7'],'C': ['C4', 'C5', 'C6', 'C7']
}, index=[2, 3, 4, 5])# 按行合并df1和df2,使用内连接
result = pd.concat([df1, df2], join='inner')
print(result)

输出:

B
2   B2
3   B3
2   B4
3   B5

注意:这里的结果并不是我们想要的,因为join='inner'在concat中并不是按照SQL中的内连接逻辑来执行的。它实际上是基于索引的交集来保留行,而不是基于列值的交集。对于内连接,我们通常会使用merge方法。

示例4:处理列名冲突

假设我们有两个关于学生成绩的DataFrame,分别记录了语文成绩和数学成绩,且它们具有相同的索引(学生编号)。我们可以使用concat将其横向拼接,但为了避免列名冲突,我们可以只选择需要的列进行拼接。

# 创建示例数据
chinese_scores = pd.DataFrame({'student_id': [1, 2, 3],'chinese_score': [85, 90, 78]
})math_scores = pd.DataFrame({'student_id': [1, 2, 3],'math_score': [88, 92, 80]
})# 只选择成绩列进行拼接
result = pd.concat([chinese_scores['chinese_score'], math_scores['math_score']], axis=1)
print(result)

输出:

chinese_score  math_score
0             85          88
1             90          92
2             78          80

二、merge方法

merge函数更类似于SQL中的JOIN操作,它根据某些键(通常是共同的列)来合并两个DataFrame。它可以实现一对一、一对多、多对多等多种复杂的关联关系。

1. 基本语法

pandas.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
  • left:左侧的DataFrame。
  • right:右侧的DataFrame。
  • how:指定合并的方式,常见的有'inner'(内连接)、'outer'(外连接)、'left'(左连接)、'right'(右连接)。
  • on:指定用于合并的列名,当左右两侧的列名相同时使用此参数。
  • left_on和right_on:当左右两侧用于合并的列名不同时,分别指定左右两侧的列名。
  • suffixes:当存在重复列名时,给左右两侧的列添加后缀以区分。

其他参数主要用于高级用法,如添加合并指示列等。

2. 示例

示例1:内连接(Inner Join)
import pandas as pd# 创建两个DataFrame
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', 'K4'],'C': ['C0', 'C1', 'C2', 'C3'],'D': ['D0', 'D1', 'D2', 'D3']
})# 按'key'列进行内连接
result = pd.merge(left, right, on='key')
print(result)

输出:

key  A  B  C  D
0  K0  A0  B0  C0  D0
K0 A0 B0 C0 D0
1 K1 A1 B1 C1 D1
2 K2 A2 B2 C2 D2
示例2:外连接(Outer Join)

在外连接中,合并后的DataFrame将包含左表和右表中的所有行。如果某个键在其中一个表中不存在,则相应的列将填充为NaN。

#按'key'列进行外连接
result_outer = pd.merge(left, right, on='key', how='outer')
print(result_outer)

输出:

key    A    B    C    D
0 K0 A0 B0 C0 D0
1 K1 A1 B1 C1 D1
2 K2 A2 B2 C2 D2
3 K3 A3 B3 NaN NaN
4 K4 NaN NaN C3 D3
示例3:左连接(Left Join)

左连接将返回左表中的所有行以及右表中与左表匹配的行。如果右表中没有匹配的行,则结果中的相应列将填充为NaN。

#按'key'列进行左连接
result_left = pd.merge(left, right, on='key', how='left')
print(result_left)

输出:

key    A    B    C    D
0 K0 A0 B0 C0 D0
1 K1 A1 B1 C1 D1
2 K2 A2 B2 C2 D2
3 K3 A3 B3 NaN NaN
示例4:右连接(Right Join)

右连接与左连接相反,它将返回右表中的所有行以及左表中与右表匹配的行。如果左表中没有匹配的行,则结果中的相应列将填充为NaN。

#按'key'列进行右连接
result_right = pd.merge(left, right, on='key', how='right')
print(result_right)

输出:

key    A    B    C    D
0 K0 A0 B0 C0 D0
1 K1 A1 B1 C1 D1
2 K2 A2 B2 C2 D2
3 K4 NaN NaN C3 D3
示例5:基于多个键的合并

有时,我们可能需要基于多个键来合并两个DataFrame。这可以通过在on参数中传递一个键的列表或在left_on和right_on参数中分别指定左右两侧的键来实现。

#创建两个基于多个键的DataFrame
left_multi = pd.DataFrame({
'key1': ['K0', 'K0', 'K1', 'K2'],
'key2': ['K0', 'K1', 'K0', 'K0'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']
})right_multi = pd.DataFrame({
'key1': ['K0', 'K1', 'K1', 'K2'],
'key2': ['K0', 'K0', 'K1', 'K0'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']
})
#基于多个键进行合并
result_multi = pd.merge(left_multi, right_multi, on=['key1', 'key2'])
print(result_multi)

输出:

key1 key2 A B C D
0 K0 K0 A0 B0 C0 D0
1 K1 K0 A2 B2 C1 D1

总结

Pandas的concat和merge方法提供了强大的数据合并功能。concat方法适用于简单的拼接操作,如按行或按列合并。而merge方法则更类似于SQL中的JOIN操作,可以根据一个或多个键来合并两个DataFrame,实现复杂的关联关系。在实际应用中,我们可以根据具体需求选择合适的方法来合并数据。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker的数据卷与dockerfile自定义镜像

docker的数据卷与dockerfile自定义镜像 一. docker的数据卷数据卷容器 二. dockerfile自定义镜像2.1 dockerfile的命令格式镜像的操作命令add和copy的区别 容器启动的命令 2.2 run命令2.3 其它端口映射 三. 练习 一. docker的数据卷 容器于宿主机之间,或者容器和容…

【大数据】机器学习 -----关于data.csv数据集分析案例

打开表 import pandas as pd df2 pd.read_csv("data.csv",encoding"gbk") df2.head()查看数据属性(列标题,表形状,类型,行标题,值) print("列标题:",df2.columns)Data…

开发规范

开发规范 企业项目开发有2种开发模式:前后台混合开发和前后台分离开发。 前后台混合开发 顾名思义就是前台后台代码混在一起开发,如下图所示: 这种开发模式有如下缺点: 沟通成本高:后台人员发现前端有问题&#xf…

【Mysql进阶知识】从.SQL文件中执行SQL语句

目录 方法一:使用source命令导入 方法二:使用mysql客户端导入 方法一:使用source命令导入 有时候我们需要从 SQL 文件执行一些 SQL 语句,比如要把一个数据库从一台服务器 A 复制到另一台服务器 B 上,那么可以先从服务…

springMVC---resultful风格

目录 一、创建项目 pom.xml 二、配置文件 1.web.xml 2.spring-mvc.xml 三、图解 四、controller 一、创建项目 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi…

RustDesk ID更新脚本

RustDesk ID更新脚本 此PowerShell脚本自动更新RustDesk ID和密码&#xff0c;并将信息安全地存储在Bitwarden中。 特点 使用以下选项更新RustDesk ID&#xff1a; 使用系统主机名生成一个随机的9位数输入自定义值 为RustDesk生成新的随机密码将RustDesk ID和密码安全地存储…

告别 Excel,拥抱 R 语言:开启数据分析新时代

在这个数据驱动的时代&#xff0c;数据分析已然成为每个行业的核心竞争力。从市场营销到金融领域&#xff0c;从医疗健康到教育行业&#xff0c;数据无处不在&#xff0c;深刻影响着每一个决策。然而&#xff0c;面对日益复杂的数据集&#xff0c;单纯依靠 Excel 进行分析&…

LabVIEW驱动电机实现样品自动搜索

利用LabVIEW控制电机驱动相机在XY平面上进行扫描&#xff0c;以检测样品位置。样品最初可能位于相机视野范围之外&#xff0c;需要实现自动搜索样品位置并完成精确定位扫描的功能。该系统需具有以下特点&#xff1a; 高效搜索&#xff1a;能够快速确定样品位置&#xff0c;缩短…

【C语言】_字符串拷贝函数strcpy

目录 1. 函数声明及功能 2. 使用示例 3. 注意事项 4. 模拟实现 4.1 第一版&#xff1a;基本功能判空const修饰 4.2 第二版&#xff1a;优化对于\0的单独拷贝 4.3 第三版&#xff1a;仿strcpy的char*返回值 1. 函数声明及功能 char * strcpy ( char * destination, cons…

大模型WebUI:Gradio全解11——Chatbots:融合大模型的多模态聊天机器人(3)

大模型WebUI&#xff1a;Gradio全解11——Chatbot&#xff1a;融合大模型的多模态聊天机器人&#xff08;3&#xff09; 前言本篇摘要11. Chatbot&#xff1a;融合大模型的多模态聊天机器人11.3 组件Chatbot及ChatMessage11.3.1 Chatbot&#xff1a;聊天机器人组件1. API参数2.…

细说STM32F407单片机窗口看门狗WWDG的原理及使用方法

目录 一、窗口看门狗的工作原理 1、递减计数器 2、窗口值和比较器 3、看门狗的启动 4、提前唤醒中断 二、窗口看门狗的HAL驱动程序 1、窗口看门狗初始化 2.窗口看门狗刷新 3.EWI中断及其处理 三、不开启EWI的WWDG示例 1、示例功能 2、项目设置 &#xff08;1&…

Docker部署Spring Boot + Vue项目

目录 前提条件 概述 下载代码 打开代码 Docker创建网络 MySQL容器准备 MySQL数据库配置 启动MySQL容器 测试连接MySQL 初始化MySQL数据 Redis容器准备 修改Redis配置 启动redis容器 部署后端 后端代码打包 上传jar包到Linux 创建Dockerfile 构建镜像 运行后…

基于Oracle与PyQt6的电子病历多模态大模型图形化查询系统编程构建

一、引言 1.1 研究背景阐述 在当今数字化时代,医疗行业正经历着深刻的变革,数字化转型的需求日益迫切。电子病历(EMR)作为医疗信息化的核心,其管理的高效性和数据利用的深度对于提升医疗服务质量、优化临床决策以及推动医学研究具有至关重要的意义。传统的电子病历管理系…

万字长文介绍ARINC 653,以及在综合模块化航空电子设备(IMA)中的作用

文章目录 一、引言二、ARINC 653背景三、整体系统架构四、应用/执行&#xff08;APEX&#xff09;接口五、ARINC 653 RTOS内部机制六、健康监测功能七、软件应用八、ARINC 653现状九、总结 一、引言 在现代航空领域&#xff0c;综合模块化航空电子设备&#xff08;IMA&#xf…

在eNSp上telnet一下吧

在上篇博客&#xff1a;DNS 我们提到了telnet和设备带外管理、带内管理&#xff0c;它确实是非常有趣的一个知识点哦&#xff0c;接下来我们一起来学习学习吧~ Telnet&#xff08;远程登陆协议&#xff09; Telnet基于TCP 23号端口&#xff0c;典型的C/S架构模式&#xff0c;是…

音频语言模型与多模态体系结构

音频语言模型与多模态体系结构 多模态模型正在创造语言、视觉和语音等以前独立的研究领域的协同效应。这些模型使用通用架构,将每种模式视为不同的“token”,使它们能够以一种与人类认知非常相似的方式联合建模和理解世界。 ​ ​可以将多模态分为两个主要领域:输入空间(…

【深度学习】关键技术-正则化(Regularization)

正则化&#xff08;Regularization&#xff09; 是一种用于防止模型过拟合的技术。它通过在损失函数中添加额外的约束项&#xff0c;限制模型的复杂度&#xff0c;从而提高模型的泛化能力。 正则化的主要作用 防止过拟合&#xff1a;通过抑制模型对训练数据的过度拟合&#xf…

怎么在iPhone手机上使用便签进行记录?

宝子们&#xff0c;在这个快节奏的时代&#xff0c;灵感的火花总是一闪而过&#xff0c;待办事项也常常让人应接不暇。好在咱们的 iPhone手机便签超给力&#xff0c;能满足各种记录需求&#xff01;今天就来给大家分享一下&#xff0c;如何在 iPhone 手机上巧用便签&#xff0c…

渗透测试之越权漏洞详解 水平越权 垂直越权 目录越权 SQL跨库查询越权 以及未授权漏洞 一篇文章说明白

目录 什么是越权 越权漏洞形成的原因是&#xff1a; 越权常见分类 漏洞产生条件 越权细分类 水平越权&#xff1a; 水平越权解释&#xff1a; 垂直越权&#xff1a; 垂直越权示例: 解释: 修复建议 例如 越权漏洞易发生的点 1.基础参数 2.多阶段验证 3.基于参数的访…

ANSYS Fluent学习笔记(七)求解器四部分

16.亚松弛因子 Controls面板里面设置&#xff0c;它能够稳定计算的过程。如果采用常规的迭代算法可能结果就会发生振荡的情况。采用亚松驰因子可以有助于残差的稳定。 他的取值范围是0-1&#xff0c;0代表没有亚松驰&#xff0c;1表示物理量变化很快&#xff0c;一般情况下取…