Pandas 提供的 merge() 函数能够进行高效的合并操作,这与 SQL 关系型数据库的 MERGE 用法非常相似。从字面意思上不难理解,merge 翻译为“合并”,指的是将两个 DataFrame 数据表按照指定的规则进行连接,最后拼接成一个新的 DataFrame 数据表。

 merge() 函数的法格式如下:

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)

参数说明,如下表所示:

参数名称 说明
left/right 两个不同的 DataFrame 对象。
on 指定用于连接的键(即列标签的名字),该键必须同时存在于左右两个 DataFrame 中,如果没有指定,并且其他参数也未指定, 那么将会以两个 DataFrame 的列名交集做为连接键。
left_on 指定左侧 DataFrame 中作连接键的列名。该参数在左、右列标签名不相同,但表达的含义相同时非常有用。
right_on 指定左侧 DataFrame 中作连接键的列名。
left_index 布尔参数,默认为 False。如果为 True 则使用左侧 DataFrame 的行索引作为连接键,若 DataFrame 具有多层
索引(MultiIndex),则层的数量必须与连接键的数量相等。
right_index 布尔参数,默认为 False。如果为 True 则使用左侧 DataFrame 的行索引作为连接键。
how 要执行的合并类型,从 {'left', 'right', 'outer', 'inner'} 中取值,默认为“inner”内连接。
sort 布尔值参数,默认为True,它会将合并后的数据进行排序;若设置为 False,则按照 how 给定的参数值进行排序。
suffixes 字符串组成的元组。当左右 DataFrame 存在相同列名时,通过该参数可以在相同的列名后附加后缀名,默认为('_x','_y')。
copy 默认为 True,表示对数据进行复制。

注意:Pandas 库的 merge() 支持各种内外连接,与其相似的还有 join() 函数(默认为左连接)。

下面创建两个不同的 DataFrame,然后对它们进行合并操作:

  1. import pandas as pd
  2. left = pd.DataFrame({
  3. 'id':[1,2,3,4],
  4. 'Name': ['Smith', 'Maiki', 'Hunter', 'Hilen'],
  5. 'subject_id':['sub1','sub2','sub4','sub6']})
  6. right = pd.DataFrame({
  7. 'id':[1,2,3,4],
  8. 'Name': ['William', 'Albert', 'Tony', 'Allen'],
  9. 'subject_id':['sub2','sub4','sub3','sub6']})
  10. print (left)
  11. print (right)

输出如下:

   id    Name subject_id
0 1 Smith sub1
1 2 Maiki sub2
2 3 Hunter sub4
3 4 Hilen sub6 id Name subject_id
0 1 William sub2
1 2 Albert sub4
2 3 Tony sub3
3 4 Allen sub6

1) 在单个键上进行合并操作

通过 on 参数指定一个连接键,然后对上述 DataFrame 进行合并操作:

  1. import pandas as pd
  2. left = pd.DataFrame({
  3. 'id':[1,2,3,4],
  4. 'Name': ['Smith', 'Maiki', 'Hunter', 'Hilen'],
  5. 'subject_id':['sub1','sub2','sub4','sub6']})
  6. right = pd.DataFrame({
  7. 'id':[1,2,3,4],
  8. 'Name': ['William', 'Albert', 'Tony', 'Allen'],
  9. 'subject_id':['sub2','sub4','sub3','sub6']})
  10. #通过on参数指定合并的键
  11. print(pd.merge(left,right,on='id'))

输出结果:

   id  Name_x subject_id_x   Name_y subject_id_y
0 1 Smith sub1 William sub2
1 2 Maiki sub2 Albert sub4
2 3 Hunter sub4 Tony sub3
3 4 Hilen sub6 Allen sub6

2) 在多个键上进行合并操作

下面示例,指定多个键来合并上述两个 DataFrame 对象:

  1. import pandas as pd
  2. left = pd.DataFrame({
  3. 'id':[1,2,3,4],
  4. 'Name': ['Smith', 'Maiki', 'Hunter', 'Hilen'],
  5. 'subject_id':['sub1','sub2','sub4','sub6']})
  6. right = pd.DataFrame({
  7. 'id':[1,2,3,4],
  8. 'Name': ['Bill', 'Lucy', 'Jack', 'Mike'],
  9. 'subject_id':['sub2','sub4','sub3','sub6']})
  10. print(pd.merge(left,right,on=['id','subject_id']))

输出结果:

   id Name_x subject_id Name_y
0 4 Hilen sub6 Mike

使用how参数合并

通过how参数可以确定 DataFrame 中要包含哪些键,如果在左表、右表都不存的键,那么合并后该键对应的值为 NaN。为了便于大家学习,我们将 how 参数和与其等价的 SQL 语句做了总结:

Merge方法 等效 SQL 描述
left LEFT OUTER JOIN 使用左侧对象的key
right RIGHT OUTER JOIN 使用右侧对象的key
outer FULL OUTER JOIN 使用左右两侧所有key的并集
inner INNER JOIN 使用左右两侧key的交集

1) left join

  1. import pandas as pd
  2. left = pd.DataFrame({
  3. 'id':[1,2,3,4],
  4. 'Name': ['Smith', 'Maiki', 'Hunter', 'Hilen'],
  5. 'subject_id':['sub1','sub2','sub4','sub6']})
  6. right = pd.DataFrame({
  7. 'id':[1,2,3,4],
  8. 'Name': ['Bill', 'Lucy', 'Jack', 'Mike'],
  9. 'subject_id':['sub2','sub4','sub3','sub6']})
  10. #以left侧的subject_id为键
  11. print(pd.merge(left,right,on='subject_id',how="left"))

输出结果:

   id_x  Name_x subject_id  id_y Name_y
0 1 Smith sub1 NaN NaN
1 2 Maiki sub2 1.0 Bill
2 3 Hunter sub4 2.0 Lucy
3 4 Hilen sub6 4.0 Mike

2) right join

  1. import pandas as pd
  2. left = pd.DataFrame({
  3. 'id':[1,2,3,4],
  4. 'Name': ['Smith', 'Maiki', 'Hunter', 'Hilen'],
  5. 'subject_id':['sub1','sub2','sub4','sub6']})
  6. right = pd.DataFrame({
  7. 'id':[1,2,3,4],
  8. 'Name': ['Bill', 'Lucy', 'Jack', 'Mike'],
  9. 'subject_id':['sub2','sub4','sub3','sub6']})
  10. #以right侧的subject_id为键
  11. print(pd.merge(left,right,on='subject_id',how="right"))

输出结果:

   id_x  Name_x subject_id  id_y Name_y
0 2.0 Maiki sub2 1 Bill
1 3.0 Hunter sub4 2 Lucy
2 4.0 Hilen sub6 4 Mike
3 NaN NaN sub3 3 Jack

3) outer join(并集)

  1. import pandas as pd
  2. left = pd.DataFrame({
  3. 'id':[1,2,3,4],
  4. 'Name': ['Smith', 'Maiki', 'Hunter', 'Hilen'],
  5. 'subject_id':['sub1','sub2','sub4','sub6']})
  6. right = pd.DataFrame({
  7. 'id':[1,2,3,4],
  8. 'Name': ['Bill', 'Lucy', 'Jack', 'Mike'],
  9. 'subject_id':['sub2','sub4','sub3','sub6']})
  10. #求出两个subject_id的并集,并作为键
  11. print(pd.merge(left,right,on='subject_id',how="outer"))

输出结果:

   id_x  Name_x subject_id  id_y Name_y
0 1.0 Smith sub1 NaN NaN
1 2.0 Maiki sub2 1.0 Bill
2 3.0 Hunter sub4 2.0 Lucy
3 4.0 Hilen sub6 4.0 Mike
4 NaN NaN sub3 3.0 Jack

4) inner join(交集)

  1. import pandas as pd
  2. left = pd.DataFrame({
  3. 'id':[1,2,3,4],
  4. 'Name': ['Smith', 'Maiki', 'Hunter', 'Hilen'],
  5. 'subject_id':['sub1','sub2','sub4','sub6']})
  6. right = pd.DataFrame({
  7. 'id':[1,2,3,4],
  8. 'Name': ['Bill', 'Lucy', 'Jack', 'Mike'],
  9. 'subject_id':['sub2','sub4','sub3','sub6']})
  10. #求出两个subject_id的交集,并将结果作为键
  11. print(pd.merge(left,right,on='subject_id',how="inner"))

输出结果:

   id_x  Name_x subject_id  id_y Name_y
0 2 Maiki sub2 1 Bill
1 3 Hunter sub4 2 Lucy
2 4 Hilen sub6 4 Mike

注意:当 a 与 b 进行内连操作时 a.join(b) 不等于 b.join(a)。

pandas之合并操作的更多相关文章

  1. Pandas | 19 合并/连接

    Pandas具有功能全面的高性能内存中连接操作,与SQL等关系数据库非常相似.Pandas提供了一个单独的merge()函数,作为DataFrame对象之间所有标准数据库连接操作的入口 - pd.me ...

  2. Pandas的拼接操作

    pandas的拼接操作 pandas的拼接分为两种: 级联:pd.concat, pd.append 合并:pd.merge, pd.join import pandas as pd import n ...

  3. 利用os和pandas来合并当前目录下所有excel文件

    #1.引入模块 import os import pandas as pd #2.取出指定目录下的全部excel文件路径 path="C:\\TEST" dirlist=[] fo ...

  4. (四)pandas的拼接操作

    pandas的拼接操作 #重点 pandas的拼接分为两种: 级联:pd.concat, pd.append 合并:pd.merge, pd.join 0. 回顾numpy的级联 import num ...

  5. pandas的级联操作

    级联操作 pd.concat, pd.append import pandas as pd from pandas import DataFrame import numpy as np pandas ...

  6. eclipse svn分支与合并操作

    以前做项目的时候没有用过svn的分支合并操作,今天用到了,刚开始还真不会啊.最后查了下就是这么的方便.专门记录下来. 原文来自:http://blog.csdn.net/lisq037/article ...

  7. C#文件的拆分与合并操作示例

    C#文件的拆分与合并操作示例代码. 全局变量定义 ;//文件大小 //拆分.合并的文件数 int count; FileInfo splitFile; string splitFliePath; Fi ...

  8. pandas的apply操作

    pandas的apply操作类似于Scala的udf一样方便,假设存在如下dataframe: id_part pred pred_class v_id 0 d [0.722817, 0.650064 ...

  9. pandas列合并为一行

    将dataframe利用pandas列合并为一行,类似于sql的GROUP_CONCAT函数.例如如下dataframe id_part pred pred_class v_id 0 d 0 0.12 ...

  10. git分支与主干合并操作

    git分支与主干合并操作1.主干合并分支在主干上合并分支 branch (master)git merge branch --squash 提交合并后的代码 (master)git commit -m ...

随机推荐

  1. C# core 最简单的方式写入日志

    System.IO.StreamWriter sw = System.IO.File.AppendText( LogPath + LogFielPrefix + "Error-" ...

  2. element-ui switch

    <el-tooltip :content="'Switch value: ' + value" placement="top"> <el-sw ...

  3. zxb2022习题班26

    (1) 购买日是2x21年12月31日, 理由:从该日起,甲公司能够控制乙公司的财务和经营决策:该项交易后续不存在实质性障碍. 商誉=10*10000-100000*80%=20000 相关会计分录: ...

  4. java学习问题

    1.nacos Connection refused: connect 由于配置文件配置错误引起的.我的nacos是部署在另一台linux服务器的,yml具体配置如下:

  5. Verilog中端口的连接规则

    摘自于(15条消息) Verilog中端口应该设置为wire形还是reg形_CLL_caicai的博客-CSDN博客, 以及(15条消息) Verilog端口连接规则_「已注销」的博客-CSDN博客_ ...

  6. 3Des加密解密,java c#通用。

    1.需要实现对其他系统的单点登陆,我们实现的方法很简单,就是将当前系统的账号通过加密去获取 需要直接登陆上的系统的token,然后访问需直接登陆的系统就带着token,就相当于登陆了. 2.然后呢,我 ...

  7. 字符流---->字符过滤流 缓冲流 : -----> printWrite用法:和BufferedReader用法

    printWrite用法:1.创建字符节点流FileWriter fw = new FileWriter("Files\\bufchar.txt");2创建字符过滤流 PrintW ...

  8. 掷骰子【普通线性DP】【转移方程可以优化为矩阵快速幂】

    掷骰子 思路 可以先定义一个状态f[i] [j]: 前i个骰子,最后一个面是j的方法数, 肯定超时,然鹅可以混一些分,代码如下 for(int i=1;i<=6;i++) f[0][i]=1; ...

  9. .net 反射简单介绍

    1.什么是反射 反射是.NET中的重要机制,通过反射,可以在运行时获得程序或程序集中每一个类型(包括类.结构.委托.接口和枚举等)的成员和成员的信息.有了反射,即可对每一个类型了如指掌.另外我还可以直 ...

  10. Java工程结构 应用分层

    (一) 应用分层 1. [推荐]图中默认上层依赖于下层,箭头关系表示可直接依赖,如:开放接口层可以依赖于 Web 层,也可以直接依赖于 Service 层,依此类推: • 开放接口层:可直接封装 Se ...