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. Python调用钉钉群机器人发送群消息

    1.首先需要一个钉钉群,群才有机器人 2.群设置->智能群助手->添加机器人->自定义机器人 3.添加自定义机器人,配置如下:给机器人命名,选择加签.保存机器人的秘钥.Webhook ...

  2. tp 获取器的使用中应该怎么append 自定义数据

    $data = model('organization_area')->getListByNoPage($where, 'create_time asc');foreach ($data as ...

  3. 励志成为python大佬的第一天

    1.编码 2.格式化字符 3.list,dict,tuple,set 4.return 5.参数

  4. Java学习笔记2-1

    2.对象容器(1)   今天学习一下Java里面的一些容器的基本功能,今天先来Arraylist. 一.Arraylist   容器类主要是为了存放一些按某些方式排列的对象,arraylist是一种容 ...

  5. Vivado工程常见报错及解决办法

    1. 在进行自定义 IP 后,将自定义 IP 添加到当前的工程时,出现如下报错: [IP_Flow 19-167] Failed to deliver one or more file(s). [IP ...

  6. Chorme 兼容

    Chorme自动更新,不知道什么时候版本 就变了.之前好用的代码,突然不好用了. 启动时提示Only local connections are allowed 检查一下兼容性参照下文,下载对应的Dr ...

  7. 3、一个简单的Java应用程序

    /* 1.Java中区分大小写,如果出现了大小写拼写错误,例如将main拼写成Main,则程序将无法运行. 2.关键字public成为访问修饰符,用来控制程序的其他部分对这段代码的访问级别. 3.关键 ...

  8. 使用TLS/SSL传输层安全机制实现web项目的通信安全

    自己的web项目在内网ip访问时,浏览器会提示不安全 原因就是因为没有证书,而传输层的TLS/SSL协议,会告诉我们本地客户端的浏览器,我现在访问的web项目的ip地址可能存在安全风险 要解决这个通信 ...

  9. django_ORM基础字段和选项

    一.修改ORM 1.任何关于表结构的修改,务必在对应模型类上修改. 2.在上一篇博文中,创建了bookstore_book表,如果需要再添加一个名为info(varchar 100)的字段,则需要如下 ...

  10. Lenovo Vantage 完全卸载

    Lenovo Vantage 完全卸载 我的T480,最近因为在休眠状态下断电导致不开机,按开机键所有灯闪烁.翻阅百度发现居然是通病,自从 type-c 供电方案以来就有,无奈只有被奸商坑了350,只 ...