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. 配置Nginx 反向代理 + go在windows 环境下编译运行在linux的文件

    在源码根目录下 创建build.bat: set GOOS=linux set GOARCH=amd64 go build -o build/myweb main.go 在终端执行: ./build. ...

  2. python for houdini——python在houdini中的基础应用02

    内容来源于网上视频 一.houdini python编译器 1.python shell 2.python source editor----代码可以随场景保存 构造的函数可以在外部通过hou.ses ...

  3. 【原创】SeetaFace2 Android编译

    SeetaFace2 github上有很完整的编译说明,但是自己编译过程中还是遇到了一点小问题.记录一下 编译环境: wsl ubuntu 20.04 执行编译命令 cmake .. -DCMAKE_ ...

  4. AI技术网关如何用于安全生产监测?有什么优势?

    现代工业生产和运营的规模越来越庞大.系统和结构越来越复杂,现场的风险点多面广,给作业一线的安全监管带来极大的挑战.针对工地.煤矿.危化品.加油站.烟花爆竹.电力等行业的安全生产监管场景,可以借助AI智 ...

  5. 自行封装JDBCUtils

    自己封装JDBCUtils package com.javasm.util; import com.javasm.bean.Emp; import com.javasm.constants.JDBCC ...

  6. mysql根据一个表更新另外一个表

    -- 语法:update table_1 t1,table_2 t2 set t1.column = t2.column where t1.id = t2.pid; UPDATE house_test ...

  7. 关于rust cargo下载依赖慢的解决方法(转载)

    网址: https://zhuanlan.zhihu.com/p/74875840?from_voters_page=true win环境基本输入两个命令就好了 $env:http_proxy=&qu ...

  8. iOS C#远程推送证书.p12文件制作

    1.PushChat.certSigningRequest      请求证书文件 生成Certificate Signing Request (CSR): 2.填写你的邮箱和Common Name, ...

  9. KLatexformula - MathType在Mac上的替代品

    KLatexformula - MathType alternative for MAC 1. KLatexformular 好用! 买了Mac, 升级了系统, MathType安装不了, 寻寻觅觅- ...

  10. mysql索引类型详解

    转载网址: http://c.biancheng.net/view/7897.html