pandas 合并2个excel的数据 merge 和 concat 方法介绍

news/2025/2/23 20:02:15/文章来源:https://www.cnblogs.com/yoyoketang/p/18732707

Pandas 数据合并五大方法详解
在Python 的 Pandas 库中,数据合并是数据处理的重要环节。以下是五种主要的数据合并方法,它们各自适用于不同的场景:
concat, merge, join,append,assign

  • merge():这个函数类似于SQL的JOIN操作,用于基于某些关键字或索引将不同的DataFrame合并成一个新的DataFrame。它可以接受多个要合并的对象以及一个如何匹配这些对象的关键字参数。merge() 默认执行内连接(INNER JOIN),但也可以通过参数设置执行左外连接、右外连接或全外连接。

  • join():此函数主要用于通过索引将不同的DataFrame合并。它通常会自动推断如何连接数据,但也可以通过参数来指定连接类型。与merge()不同的是,join() 主要是在索引上进行操作,而不是基于列。

  • append():这个方法允许您将一个或多个DataFrame添加到原始DataFrame的末尾。它接受一个或多个要添加的DataFrame,并且可以通过设置ignore_index参数来决定是否重置添加后的DataFrame的索引。

  • assign():这个方法允许您在一个现有的DataFrame上添加新的列,新列可以是现有数据的派生或完全是新的数据。这个方法对于创建新列并且基于现有列进行计算非常有用。

concat() 方法

concat() 这个函数主要用于沿着轴向堆叠 DataFrame 或 Series 对象。它可以接受一个列表或字典形式的数据源。
如果传入的是轴标签相同的多个对象,它们会沿着指定轴连接起来。
默认情况下,concat() 沿着行向量堆叠。通过设置 axis 参数,可以改变合并的方向,axis=1 表示列向合并。

基本语法

pandas.concat(objs, axis=0, join='outer', ignore_index=False)

参数:

  • objs:要连接的DataFrame对象的序列。
  • axis:连接的轴,0表示纵向堆叠,1表示横向堆叠。
  • join:连接方式,可以是'outer'或'inner'。
  • ignore_index:如果为True,不使用原来的索引,而是使用一个默认的整数索引。

横向堆叠示例

import pandas as pd# 创建示例DataFrame
df1 = pd.DataFrame({'姓名': ['张三', '李四', '赵五', '王六'],'分数': ['78', '93', '87', '67']})df2 = pd.DataFrame({'姓名': ['黄中', '李白', '周王', '刘备'],'分数': ['34', '65', '77', '87']})# 横向堆叠 示例
new_df = pd.concat([df1, df2], axis=0, join='outer', ignore_index=False)
print(new_df)

运行结果:

   姓名  分数
0  张三  78
1  李四  93
2  赵五  87
3  王六  67
0  黄中  34
1  李白  65
2  周王  77
3  刘备  87

设置 ignore_index=True 就可以得到

   姓名  分数
0  张三  78
1  李四  93
2  赵五  87
3  王六  67
4  黄中  34
5  李白  65
6  周王  77
7  刘备  87

设置 axis=1 表示列向合并

import pandas as pd# 创建示例DataFrame
df1 = pd.DataFrame({'姓名': ['张三', '李四', '赵五', '王六'],'分数': ['78', '93', '87', '67']})df2 = pd.DataFrame({'姓名': ['黄中', '李白', '周王', '刘备'],'分数': ['34', '65', '77', '87']})# 纵向堆叠 示例
new_df = pd.concat([df1, df2], axis=1, join='outer', ignore_index=True)
print(new_df)

运行结果

    0   1   2   3
0  张三  78  黄中  34
1  李四  93  李白  65
2  赵五  87  周王  77
3  王六  67  刘备  87

merge 方法介绍

pandas 库中的 merge() 方法用于根据一个或多个键将两个 DataFrame 对象进行合并。这个方法类似于 SQL 中的 JOIN 操作,支持多种连接方式,如内连接、外连接、左连接和右连接
默认情况下,它会根据两个DataFrame中的列名进行合并。

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'(右连接)。默认为 'inner'。
on: 指定用于连接的列名或索引名。left 和 right 中必须同时存在该列名或索引名。
left_on:指定左表中用于连接的列名或索引名。
right_on:指定右表中用于连接的列名或索引名。
left_index:布尔值,默认为 False。如果为 True,则使用左表的索引作为连接键。
right_index:布尔值,默认为 False。如果为 True,则使用右表的索引作为连接键。
sort:布尔值,默认为 False。如果为 True,则按连接键对结果进行排序。
suffixes:元组,指定当左表和右表中有相同列名时生成的后缀。默认为 ('_x', '_y')。
copy: 布尔值,默认为 True。如果为 False,则避免不必要的复制操作。
indicator:布尔值或字符串,默认为 False。如果为 True,则在结果中添加一列 '_merge',显示每一行来源的表。如果是指定的字符串,则使用该字符串作为列名。
validate: 字符串,指定验证连接的类型。选项包括 'one_to_one'、'one_to_many'、'many_to_one' 和 'many_to_many'。如果指定了此参数,则会在合并前检查连接的类型是否符合要求。

如果我们2个表的数据是这样的

import pandas as pd# 创建示例DataFrame
df1 = pd.DataFrame({'姓名': ['张三', '李四', '赵五', '王六'],'数学': ['78', '93', '87', '67']})df2 = pd.DataFrame({'姓名': ['张三', '李四', '赵五', '王六'],'语文': ['34', '65', '77', '87']})print(df1)
print(df2)姓名  数学
0  张三  78
1  李四  93
2  赵五  87
3  王六  67姓名  语文
0  张三  34
1  李四  65
2  赵五  77
3  王六  87

我们需要按姓名合并2个表的学生成绩, 期望得到

   姓名  数学  语文
0  张三  78  34
1  李四  93  65
2  赵五  87  77
3  王六  67  87

代码示例

import pandas as pd# 创建示例DataFrame
df1 = pd.DataFrame({'姓名': ['张三', '李四', '赵五', '王六'],'数学': ['78', '93', '87', '67']})df2 = pd.DataFrame({'姓名': ['张三', '李四', '赵五', '王六'],'语文': ['34', '65', '77', '87']})print(df1)
print(df2)
# 使用'姓名'列合并
result = pd.merge(df1, df2, on='姓名')
print(result)

有时候可能df1 表有数据,但是df2表中无数据, 需使用how='left'

import pandas as pd# 创建示例DataFrame
df1 = pd.DataFrame({'姓名': ['李四', '赵五', '王六', '张三'],'数学': ['93', '87', '67', '33']})df2 = pd.DataFrame({'姓名': ['张三', '李四', '赵五'],'语文': ['34', '65', '77']})# 使用'姓名'列合并
result = pd.merge(df1, df2, on='姓名', how='left')
print(result)

运行结果

   姓名  数学   语文
0  李四  93   65
1  赵五  87   77
2  王六  67  NaN
3  张三  33   34

读取excel表合并

读取2个excel表的数据后合并

"""
pandas 简单合并2个excel
"""
import pandas as pd# 读取第一个Excel文件
df1 = pd.read_excel('file1.xlsx')
# 读取第二个Excel文件
df2 = pd.read_excel('file2.xlsx')# 连接数据框,axis=0表示按行连接,axis=1表示按列连接
result = pd.concat([df1, df2], axis=0)  # 按行连接,你也可以设置为axis=1来按列连接# 查看结果
print(result)

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

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

相关文章

pikachu靶场搭建教程

详细介绍了pikachu靶场的搭建,并且附有安装包需要的东西phpStudy: 链接: https://pan.baidu.com/s/1fJ-5TNtdDZGUf5FhTm245g 提取码:0278 pikachu-master: Github链接:Github 链接 链接: https://pan.baidu.com/s/1lDdlxNaa3YjhIEj-WWB3qw 提取码:0278打开 phpstudy ,…

2.17周报

一、本周内容总结本周主要进行了蓝桥和天梯的训练,训练了3场蓝桥、2场天梯,剩余时间的就是赛后补题 补题的过程也重新理清了很多知识,包括gcd和lcm的应用,多项式除法的过程等等 对于蓝桥和天梯的赛制,还重新背了下很多算法的板子,包括求最短路的多种方法,不同范围求组合…

来点树链剖分

树链剖分树链剖分学习笔记 引入 给你一棵树,先单点加,再路径求和,你觉得很简单,用树上差分解决了这个问题。 再给你一棵树,先路径加,再单点查询,你觉得很简单,用树上差分解决了这个问题。 又给你一棵树,上述操作都有,而且顺序不分先后,你发现树上差分不能解决这个问…

《轻松上手:LangChain 的安装与验证全流程》

在当今快速发展的技术领域,掌握新工具是提升工作效率的关键。今天,我将为大家详细介绍如何轻松安装 LangChain,并验证其是否成功安装,让你迅速开启探索这一强大工具的旅程。 首先,在命令行中运行以下命令来安装 LangChain: pip install langchain安装完成后,为了确保一切…

双向广搜 P1032 洛谷 [NOIP 2002 提高组] 字串变换

双向广搜 P1032 洛谷 [NOIP 2002 提高组] 字串变换 题目背景 本题不保证存在靠谱的多项式复杂度的做法。测试数据非常的水,各种做法都可以通过,不代表算法正确。因此本题题目和数据仅供参考。 本题为搜索题,本题不接受 hack 数据。关于此类题目的详细内容 题目描述 已知有两…

uniapp uview u-form表单校验:表单有值却校验不通过的问题

<u-form-item label="数量" required prop="num"><u-input v-model="form.num"></u-input> </u-form-item>检查校验不通过的字段值类型是什么,如果是非string类型,要在rules上指定值类型。原因:u-form的校验规则是值…

BUS设计中的DeadLock死锁问题

本文讨论一下 BUS 设计中的 DeadLock 死锁问题,或者叫做 Cyclic Dependency 循环依赖问题。其含义是指 A 的动作导致 B 的动作无法进行下去,同样 B 的动作导致 A 的动作无法进行下去,二者相互依赖,形成死锁。 1 AXI握手死锁 在学习 AXI 协议时,手册中提到了 AXI 握手死锁,…

字符串-str

字符串-str 1.1 特点需要加上引号,单引号与双引号都可以,包含了多行内容的时候还可以用三引号name = rock #报错,没有引号识别为变量名, name = "rock" print(name) name = kyle print(name) name = """rock #多行内容时使用三引号,区分三引…

X00221-基于多智能体强化学习的车联网频谱共享python完整代码

研究基于多智能体强化学习的车联网频谱共享问题,其中多个车与车(V2V)链路复用由车与基础设施(V2I)链路占用的频谱。由于高速移动的车联网环境中信道变化快速,导致基站无法收集到准确的瞬时信道状态信息,从而无法进行集中式资源管理。对此,将资源共享建模为一个多智能体…

Week01【ElementPlus Layout 布局】

Week01【ElementPlus Layout 布局】 📅 2025/02/22 Layout 布局【ElementPlus】 通过基础的 24 分栏,迅速简便地创建布局。组件默认使用 Flex 布局,不需要手动设置 type="flex"。 请注意父容器避免使用 inline 相关样式,会导致组件宽度不能撑满(宽度坍塌)。. …

Linux 中 source命令 和 bash命令的区别

001、 Linuxbash和source命令的区别在于,当你用bash命令执行脚本时,它告诉Linux内核创建一个新的Bash进程来读取和执行脚本,将输出复制到原先的shell进程中,并显示下来. 然而source命令是一个外置的shell,它读取和评估当前shell进程中的文件。为此,脚本所做的所有修改都将…

字符串的编码及解码

1. 字符串的编码及解码解释str类型转换为bytes类型为编码bytes类型转换为str类型为解码2. 字符串的编码str类型转换为bytes类型使用字符串encode()方法语法格式:str.encode(encodeing= utf8,errors=strict/ignore/replace)出错方式:strict:严格的;报错。 ignore:忽略;rep…