Pandas 数据处理 | 多个数据表怎么合并(merge),你了解么?

article/2025/10/6 2:12:36

Pands 两个数据列表合并方法总结;

merge() 函数用于合并两个 DataFrame 对象或 Series,数据处理时经常会用到这个函数,官网给出该函数的定义如下:

pandas.merge(left, right, how: str = ‘inner’, on=None, left_on=None, right_on=None, left_index: bool = False, right_index: bool = False, sort: bool = False, suffixes=’_x’, ‘_y’, copy: bool = True, indicator: bool = False, validate=None)

先介绍一下 各参数的含义作用;

left左边的 DataFrame
right右边要合并的 DataFrame
how合并方式,一共四种: left,right,inner,outer,默认为 inner
left 仅使用来自左边frame的键进行匹配;
right 仅使用来自右边frame 的键进行匹配;
outer 取来自左右frame 键的并集;匹配不到的话元素设为Null
inner 取来自左右frame 键的交集,匹配不到的话元素丢失;
onlabel or list
选取合并的基准列也就是键名,前提该键名在两个 DataFrames 中有存在,如果未设置的话,默认为左右两个 DataFrame 的列名交集;
left_onlabel、list、array_list
左边 DataFrame 中的列或索引级别作为键;可为列名或索引名
right_onlable、list、array_list
右边DataFrame中 的列或索引级别作为键;可为列名或索引名
left_indexbool,默认False
用左边的index 作为连接键;若为多 index, 则右侧的 DataFrame 中的连接键数必须与级别数相匹配;
right_indexbool,默认为False
用右边的 index 作为连接键;若为多index,则左侧的 DataFrame 中的连接键数必须与级别数相匹配;
sortbool,默认False
对合并之后的 DataFrame 对 连接键以字典字母顺序进行和兴;
suffixestuple of (str,str),默认(_x,_y)
对左右两边出现重复列名分别加入后缀名用于区分;若设置(False,False)出现类名重叠则会抛出异常
copybool,默认为 True
为 Flase的话,避免复制
indicator布尔或 str,默认为False
为True 使,对最后的 DataFrame 加入新列,列名为"_merge" 有关每一行的匹配的基本信息
对于仅在 左边匹配成功时,取值为 left_only,仅出现在右边匹配成功时则 为 right_only;两边都匹配成功时则为 both;
validatestr、optional
如果指定,检查merge 是否为指定类型
1:1 ,检查合并键是否在左右数据集中是唯一值;
1:m ,检查合并键是否在左边数据集中是唯一值
m:1 ,检查合并键是否在右边数据集是唯一值

上面是对参数的一些介绍,下面将围绕这些参数结合一些实例操作,详细说明一下 merge() 函数的具体使用,分为几个部分:

左右 DataFrame 有相同 key 值时;

**设置参数 on 实现两个DataFrame 的简单合并 **

In [1]: import pandas as pdIn [2]: data1 =pd.DataFrame({'key':['K0','K1','K2','K3'],...:                 'A':['A0','A1','A2','A3'],...:                 'B':['B0','B1','B2','B3']})In [3]: data2 = pd.DataFrame({'key':['K0','K1','K2','K3'],})In [4]: data2 = pd.DataFrame({'key':['K0','K1','K2','K3'],...:                         'C':['C0','C1','C2','C3'],...:                         'D':['D0','D1','D2','D3']})In [5]: result = pd.merge(data1,data2,on = 'key')In [6]: result
Out[6]: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  C3  D3

merge 四种合并方式

how = “left”仅以左边的key为基准,右侧匹配失败元素设为 Null
how = “right”仅以右边的key 为基准,左侧匹配失败元素设为Null
how = “outer”以左右两边关键词并集为基准,匹配失败元素设为Null
how = “inner”左右两边关键词的交集作为基准,匹配失败的话直接 delete 该行
In [7]: data1 =pd.DataFrame({'a':['a1','a2','a3'],...:                     'b':['b1','b2','b3'],...:                     'key':['a','b','c'],...:                     'key1':['d','e','f']})...:...:In [8]: data2 = pd.DataFrame({'c':['c1','c2','c3'],...:                         'd':['d1','d2','d3'],...:                         'key':['a','b','a'],...:                         'key1':['d','e','e']})

**how= “left” 合并 **

以左边的 DataFrame 的 key 为基准,右边出现匹配失败的用 NaN 代替,出现多余 Key 表单所在的行部分直接被删除

Snipaste_2020-07-18_08-21-29.png

  • 图表解读:
    • red : 表示所在行被剔除;
    • blue :代表所在行被保留;
    • green : 表示误配的值用 NaNs 来代替;
In [9]: # how = left,以左边键为基准In [10]: pd.merge(data1,data2,how ="left",on = ['key','key1'])
Out[10]:a   b key key1    c    d
0  a1  b1   a    d   c1   d1
1  a2  b2   b    e   c2   d2
2  a3  b3   c    f  NaN  NaN

how ="right"

以右边 DataFrame 的 key 为基准,用法与 how=“left” 相似,方向相反;

Snipaste_2020-07-18_08-21-51.png

In [11]: #how = right ,以右边为基准In [12]: pd.merge(data1,data2,how = 'right',on =['key','key1'])
Out[12]:a    b key key1   c   d
0   a1   b1   a    d  c1  d1
1   a2   b2   b    e  c2  d2
2  NaN  NaN   a    e  c3  d3

how ="inner"

此合并方法在用的频率较高以左右两边 DataFrame 共有的 key 为基准,匹配成功的保留,匹配失败所在的行全部删除;

inner.png

In [16]: # how = inner,取左右交集;In [17]: pd.merge(data1,data2,how ='inner',on = ['key','key1'])
Out[17]:a   b key key1   c   d
0  a1  b1   a    d  c1  d1
1  a2  b2   b    e  c2  d2

how ="outer"

与 how=“inner” 用法对应,以左右两边 DataFrame 共有的 key 为基准,匹配成功的保留,匹配失败的键值以 Nan 进行替换;

outrt.png

In [13]: # how = outer,r取左右两边并集In [15]: pd.merge(data1,data2,how ='outer',on = ['key','key1'])
Out[15]:a    b key key1    c    d
0   a1   b1   a    d   c1   d1
1   a2   b2   b    e   c2   d2
2   a3   b3   c    f  NaN  NaN
3  NaN  NaN   a    e   c3   d3

DataFrame 具有不同 key 值合并

当要合并的两个 DataFrame 具有不同 key 值时,这里需要用到 left_on、right_on 参数,分别用来指定左右 DataFrame 的列名;

left_on 、right_on 为key 作为基准

left_on 选取 key 名时,需要对 right_on 设置对应 键名,且需要保证 len(left_on) == len(right_on),

加入 suffixes 参数,是因为左右具有相同列名( value ),保证合并后的 列名都不一样

In [18]: df1 = pd.DataFrame({'lkey': ['foo', 'bar', 'baz', 'foo'],...:                     'value': [1, 2, 3, 5]})In [19]: df2 = pd.DataFrame({'rkey': ['foo', 'bar', 'baz', 'foo'],...:                     'value': [5, 6, 7, 8]})In [20]: df1
Out[20]:lkey  value
0  foo      1
1  bar      2
2  baz      3
3  foo      5In [21]: df2
Out[21]:rkey  value
0  foo      5
1  bar      6
2  baz      7
3  foo      8In [22]: pd.merge(df1,df2,left_on ='lkey')In [23]: pd.merge(df1,df2,left_on ='lkey',right_on ='rkey')
Out[23]:lkey  value_x rkey  value_y
0  foo        1  foo        5
1  foo        1  foo        8
2  foo        5  foo        5
3  foo        5  foo        8
4  bar        2  bar        6
5  baz        3  baz        7# 设置 suffixes 参数之后
In [24]: pd.merge(df1,df2,left_on ='lkey',right_on ='rkey',suffixes=("_lf","_rf"))
Out[24]:lkey  value_lf rkey  value_rf
0  foo         1  foo         5
1  foo         1  foo         8
2  foo         5  foo         5
3  foo         5  foo         8
4  bar         2  bar         6
5  baz         3  baz         7

操作前需要保证 键值长度相等,len(left_on) == len(right_on);否则会出现下面错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-22-0660dac837b1> in <module>
----> 1 pd.merge(df1,df2,left_on ='lkey')~\Anaconda3\lib\site-packages\pandas\core\reshape\merge.py in merge(left, right, how, on, left_on, right_on, left_index, right_index, sort, suffixes, copy, indicator, validate)79         copy=copy,80         indicator=indicator,
---> 81         validate=validate,82     )83     return op.get_result()~\Anaconda3\lib\site-packages\pandas\core\reshape\merge.py in __init__(self, left, right, how, on, left_on, right_on, axis, left_index, right_index, sort, suffixes, copy, indicator, validate)617             warnings.warn(msg, UserWarning)618
--> 619         self._validate_specification()620621         # note this function has side effects~\Anaconda3\lib\site-packages\pandas\core\reshape\merge.py in _validate_specification(self)1221                     )1222                 self.left_on = [None] * n
-> 1223         if len(self.right_on) != len(self.left_on):1224             raise ValueError("len(right_on) must equal len(left_on)")1225TypeError: object of type 'NoneType' has no len()

以索引列( index )作为合并基准

merge() 也可以以索引列作为合并基准,此时用到两个参数 left_on、right_on;都设为 True;

np.random.seed([3, 14])
left = pd.DataFrame({'value': np.random.randn(4)}, index=['A', 'B', 'C', 'D'])    
right = pd.DataFrame({'value': np.random.randn(4)}, index=['B', 'D', 'E', 'F'])
left.index.name = right.index.name = 'idxkey'leftvalue
idxkey          
A      -0.602923
B      -0.402655
C       0.302329
D      -0.524349rightvalue
idxkey          
B       0.543843
D       0.013135
E      -0.326498
F       1.385076left.merge(right, left_index=True, right_index=True)value_x   value_y
idxkey                    
B      -0.402655  0.543843
D      -0.524349  0.013135

同时合并多个 DataFrame

合并多个 DataFrame 的方法有很多种,这里列出下面几条:

低效 merge()

df1.merge(df2, ...).merge(df3, ...)

方法合并时需要设置多个参数,并且较为低效;

pd.concat() 进行合并

pd.concat() 可以对多个 DataFrame 进行同时合并,合并方法与前面提到的 merge() 四种方法相同,区别是前面以关键字 how 衔接,这里以 join 作为衔接参数:

np.random.seed(0)
A = pd.DataFrame({'key': ['A', 'B', 'C', 'D'], 'valueA': np.random.randn(4)})    
B = pd.DataFrame({'key': ['B', 'D', 'E', 'F'], 'valueB': np.random.randn(4)})
C = pd.DataFrame({'key': ['D', 'E', 'J', 'C'], 'valueC': np.ones(4)})
dfs = [A, B, C] # Note, the "key" column values are unique, so the index is unique.
A2 = A.set_index('key')
B2 = B.set_index('key')
C2 = C.set_index('key')pd.concat(dfs2, axis=1, sort=False, join='inner')valueA    valueB  valueC
key                            
D    2.240893 -0.977278     1.0

4, indicator 参数

indicator 参数(设置为 True);用来表示 DataFrame 会添加新的一列 ,列名为_merge; 来表示各行的合并类型信息。

In [25]: pd.merge(data1,data2,how ='outer',on = ['key','key1'],indicator = True)
Out[25]:a    b key key1    c    d      _merge
0   a1   b1   a    d   c1   d1        both
1   a2   b2   b    e   c2   d2        both
2   a3   b3   c    f  NaN  NaN   left_only
3  NaN  NaN   a    e   c3   d3  right_only

indicator 也可以设为 String ,自定义列名

In [27]: pd.merge(data1,data2,how ='outer',on = ['key','key1'],indicator ="col_info")
Out[27]:a    b key key1    c    d    col_info
0   a1   b1   a    d   c1   d1        both
1   a2   b2   b    e   c2   d2        both
2   a3   b3   c    f  NaN  NaN   left_only
3  NaN  NaN   a    e   c3   d3  right_only

好了,以上就是本文对 merge() 用法的介绍,关于 merge() 更深入、全面的用法,以后再加讨论

最后感谢大家阅读!

Reference:

1,https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.html

2,https://stackoverflow.com/questions/53645882/pandas-merging-101

文章首发于公众号(Z先生点记


http://chatgpt.dhexx.cn/article/2kVrKexE.shtml

相关文章

[Pandas] 数据合并 pd.merge

实现类似SQL的join操作&#xff0c;通过pd.merge()方法可以自由灵活地操作各种逻辑的数据连接、合并等操作 可以将两个DataFrame或Series合并&#xff0c;最终返回一个合并后的DataFrame 语法 pd.merge(left, right, how inner, on None, left_on None, right_on None,l…

6.1 多数据源合并

1.案例介绍 通过Kettle工具将A公司和B公司的手机日销售数据合并到一个数据源&#xff08;数据表company&#xff09;中&#xff0c;也就是对文件company_a.csv和数据表company_b中的数据进行合并操作&#xff0c;并输出到数据表company中。 2.数据准备 假设&#xff0c;某公…

数据合并之concat、append、merge和join

Pandas 是一套用于 Python 的快速、高效的数据分析工具。它可以用于数据挖掘和数据分析&#xff0c;同时也提供数据清洗功能。本文将详细讲解数据合并与连接&#xff0c;目录如下&#xff1a; ① concat 一.定义 concat函数可以在两个维度上对数据进行拼接&#xff0c;默认纵向…

这些数据合并的神操作,你掌握几个?

导读&#xff1a;在数据分析过程中&#xff0c;有时候需要将不同的数据文件进行合并处理。本文主要介绍三种数据合并方法。 Pandas提供了多功能、高性能的内存连接操作&#xff0c;本质上类似于SQL等关系数据库&#xff0c;比如&#xff0c;merge、join、concat等方法可以方便地…

6、数据的合并

目录 一、添加变量即横向合并。 二、添加个案即纵向合并 在实际工作中&#xff0c;为了提高效率&#xff0c;经常需要将一份数据分成几部分分别录入&#xff0c;或为了便于分析&#xff0c;又将几个数据文件合并成一个总的数据文件。为此&#xff0c;SPSS提供了两种合并数据文…

【数据科学】05 数据合并(merge、concat、combine)与数据清洗(缺失值、重复值、内容和格式)

文章目录 1. 数据合并1.1 merge()合并1.2 concat()合并1.3 combine()合并 2. 数据清洗2.1 缺失值2.2 重复值2.3 内容与格式清洗 1. 数据合并 实际应用中&#xff0c;需要分析的数据可能来自不同的数据集&#xff0c;因此在开始数据分析之前&#xff0c;需要先将不同的数据集合…

Gradle 入门

1、Gradle 入门 1.1 Gradle 简介 Gradle 是一款 Google 推出的基于JVM、通用灵活的项目构建工具&#xff0c;支持 Maven&#xff0c;JCenter 多种第三方仓库;支持传递性 依赖管理、废弃了繁杂的 xml 文件&#xff0c;转而使用简洁的、支持多种语言(例如&#xff1a;java、gro…

Gradle【扫盲】之简易使用教程

官网地址 https://gradle.org/版本选择 如果使用的是idea&#xff0c;可以在idea的plug目录下查看支持的gradle的版本&#xff1a; 进入目录&#xff1a; 那我们到官网下载对应版本的gradle即可 Gradle下载及配置 进入官网&#xff0c;查看发行版本 选择对应的安装包 b…

Linux 安装gradle完整教程

Linux 安装gradle 1.下载gradle https://gradle.org/install/ 选择版本下载 点击下载 也可以在这里下载历史版本 https://services.gradle.org/distributions/ 2.将包上传到服务器&#xff0c;我这里下载的包是6.7的你们可以下载各自需要的版本 zip包解压 unzip gradle-8.…

gradle快速入门

1.Gradle 入门 1.1 Gradle 简介 Gradle 是一款Google 推出的基于JVM、通用灵活的项目构建工具&#xff0c;支持Maven&#xff0c;JCenter 多种第三方仓库;支持传递性依赖管理、废弃了繁杂的xml 文件&#xff0c;转而使用简洁的、支持多种语言(例如&#xff1a;java、groovy 等…

Gradle下载安装教程

前言 1.gradle和maven一样都是用来构建java程序的&#xff0c;maven2004年开始兴起&#xff0c;gradle2012年开始诞生&#xff0c;既然已经有了maven这么成熟的构建工具为什么还有gradle的诞生呢&#xff0c;因为gradle有很多地方比maven做的更好&#xff0c;例如gradle采用gro…

Gradle 15分钟入门教程

1-Gradle入门介绍 在阅读或实践本文中的实例前&#xff0c;必须首先确保已将Gradle插件安装到Eclipse中。如果没有&#xff0c;可以点击下面的链接查看Gradle安装说明&#xff1a; - http://www.yiibai.com/gradle/how-install-gradle-windows.html 本教程的目标&#xff1a; …

gradle安装与入门

1. Gradle安装(本地也可不安装&#xff0c;不安装gradle配置选择gradle wrapper) 下载地址&#xff1a;http://services.gradle.org/distributions/ 下载你所需要对应的版本&#xff0c;gradle-4.6.1-bin.zip 下载后解压到你想要的目录 设置环境变量 新建系统变量&…

Android—Gradle教程(一)

前言 在前几篇中&#xff0c;讲解了Groovy的基础语法&#xff0c;学习新语法过程总是枯燥的&#xff0c;但为了更好的掌握Gradle&#xff0c;那就必须经过该过程。当然从这一篇将会从零基础开始&#xff0c;开展对Gradle的讲解。 1. 掌握Gradle基础 1.1 环境配置 去官网下载…

Gradle使用教程

前言 相信使用Java的同学都用过Maven&#xff0c;这是一个非常经典好用的项目构建工具。但是如果你经常使用Maven&#xff0c;可能会发现Maven有一些地方用的让人不太舒服&#xff1a; Maven的配置文件是XML格式的&#xff0c;假如你的项目依赖的包比较多&#xff0c;那么XML文…

gradle入门简介以及安装

一、简介 java作为一门世界级主流编程语言&#xff0c;有一款高效易用的项目自动化构建工具是java开发者共同追求的心愿和目标。先是2000年Ant&#xff0c;后有2004年Maven两个工具的诞生&#xff0c;都在java市场上取得了巨大的成功。但是二者都有一定的不足和局限性。 2012年…

【构建工具】Gradle中文教程

文章目录 Gradle 简介Gradle 概述基于声明的构建和基于约定的构建为以依赖为基础的编程方式提供语言支持构建结构化深度 APIGradle 的扩展多项目构建多种方式管理依赖Gradle 是第一个构建集成工具易于移植GroovyThe Gradle wrapper自由和开源 为什么使用 Groovy? Gradle 安装先…

Gradle 入门教程(一):Gradle是什么

这是一篇Gradle的入门教程 一、 Gradle是什么 1.1 构建工具 要解释Gradle是什么&#xff0c;首先要搞清楚一个名词——构建工具&#xff08;Build Tool&#xff09;。 构建工具&#xff0c;顾名思义就是用于构建&#xff08;Build&#xff09;的工具&#xff0c;构建包括编…

Gradle 的下载安装教程

Gradle 8.0.1 下载安装教程 笔者的环境&#xff1a; Java 17.0.1 Gradle 8.0.1 Windows 10 教育版 64位 在继续阅读本教程之前&#xff0c;需要先完成 JDK 的安装。JDK 需要选择 8 及以上的版本。关于 JDK 的安装&#xff0c;可见笔者的另一篇博客&#xff1a; Java 的下载…

Gradle初级使用教程

一.Gradle简介 Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置&#xff0c;也增加了基于Kotlin语言的kotlin-based DSL&#xff0c;抛弃了基于XML的各种繁琐配置。 二.为什么使用Gradle Gra…