dataframe合并两个表_Pandas 数据处理 | 怎么对多个数据表合并,你了解么?

点击上方 Z先生点记,加为星标
第一时间收到 Python 技术干货!

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,默认为 innerleft  仅使用来自左边frame的键进行匹配;right 仅使用来自右边frame 的键进行匹配;outer 取来自左右frame 键的并集;匹配不到的话元素设为Nullinner 取来自左右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 pd

In [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 表单所在的行部分直接被删除

0af6f5bdba1fe27c6124915fb558bf9c.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" 相似,方向相反;

bdb668bf734d26a5d40a664e22227a0e.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  为基准,匹配成功的保留,匹配失败所在的行全部删除;

4a479bc7c01b9af8093a6917bec83314.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 进行替换;

9257eb7aef60b915ecd83089f9d68845.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      5

In [21]: df2
Out[21]:
  rkey  value
0  foo      5
1  bar      6
2  baz      7
3  foo      8

In [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)
-22-0660dac837b1> in 
----> 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)")1225
TypeError: 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'

left
           value
idxkey          
A      -0.602923
B      -0.402655
C       0.302329
D      -0.524349

right

           value
idxkey          
B       0.543843
D       0.013135
E      -0.326498
F       1.385076



left.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() 更深入、全面的用法,以后再加讨论

最后感谢大家阅读!

推荐阅读:

Pandas数据处理|apply()函数的常规用法

Pandas数据处理(三) — 分组聚类(groupby)

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

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

相关文章

中fuse_保险丝座中保险丝的材质,结构,接线方式以及区别的介绍

保险丝材料主要是由铝锑合金等低熔点合金制成的。保险丝必需是易熔化的金属丝,才能在电流大时及时熔断,起到保护作用,所以通常用铅锑合金丝。保险丝的结构:一般保险丝由三个部分组成:一是熔体部分,它是保险…

找对象年龄差多大最好_女生找对象到底最看重什么?调查了全球6万多名女性的结果是......

文/英国那些事儿微信号:hereinuk“怎么想找个女朋友这么难啊!?”这种吐槽估计不少单身男生应该都有过,“女生到底对找男朋友都有啥要求啊?!”这个问题应该也是很多男生心中久久得不到解答的问题。不过就在最…

个人生活助手app_美居App 6版重磅升级 开启智慧生活新范式

2019年12月30日,美的IoT在美的全球创新中心HolaCon场景实验室举办了主题为“全屋智慧2020智慧生活新范式”美居焕新分享会,现场发布了美居App 6版一系列重磅升级的新功能。图:美居焕新会现场美居是美的智能家居的用户入口。截至目前,已经有超过4000万的用户通过美居使用美的智能…

程序员述职报告范文_物流人员述职报告范文(通用5篇)

物流人员述职报告范文(通用5篇)时间是看不见也摸不到的,就在你不注意的时候,它已经悄悄的和你擦肩而过,回顾过去的工作,倍感充实,收获良多,需要认真地为此写一份述职报告。你还在为写述职报告而苦恼吗&…

java环境变量javac不能成功 win7_配置Java环境

jdk下载 jdk.rar运行JDK文件点击下一步点击“更改目录”,将安装目录设置在自己喜欢的地方(建议),或者直接点击下一步(此时默认装到C盘) 此处演示安装到G:codepathjava安装完后直接点解关闭(注&a…

制图折断线_CAD制图初学入门之CAD标注时必须要区分的两个概念

由于很多CAD制图初学入门者对于CAD软件中的部分功能了解的不是很清楚,所以在使用CAD标注功能的时候可能会遇到各种问题,比如CAD折弯标注和CAD线性折弯标注。下面就给大家分享一些与CAD标注有关的CAD制图初学入门技巧吧!在使用浩辰CAD软件进行…

仪表板断面_【干货】内外饰断面设计规范

您的关注和分享就是对小编最大的支持来源 ▎ 车圈没有圈前言本标准明确了内外饰、仪表板的设计要素标准,使内外饰、仪表板的断面设计更加规范化,并作为内外饰、仪表板断面设计质量的评价依据。本标准包含车身、电器、底盘、总布置、造型等部分相关的内容…

定时器_Qt定时器小坑

今天在做音视频合成功能,由于Qt的定时器精度问题,导致视频合成有问题。视频合成是采用FFmpeg实现的,将h264视频和aac视频合成到mp4容器中。音频写入到mp4容器验证过是正常的,但视频写入到mp4容器中,播放出来总是过快。…

全系统各类型工程水土保持方案编制实践技术

内容涵盖八大专题:点型项目、市政工程、线型工程、矿山工程、水利工程、取土场/弃渣场、补报项目、水土保持监测验收 课程一:点型水土保持方案编制方法及案例分析实践 课程二:市政工程水土保持方案编制方法及案例分析实践课程三:…

测量怎么显示坐标_全站仪坐标放样究竟如何操作?

全站仪是一种高技术测量仪器,集合了电,机,光为一体,它的出现让测量更为精准化,操作也更为简单便捷,也正是因为这些优势,让全站仪在工程测量中得到了非常广泛的应用。而全站仪坐标放样就是根据已…

c语言如何输入矩阵_如何在 COMSOL 软件中调试外部材料

问题描述我实现了一种用于“结构力学”的外部材料,但我的模型无法求解。解决方法外部材料一般通过 C 语言编码,然后被编译到共享库中,供 COMSOL Multiphysics 在运行时使用。如果您在编译外部材料代码时遇到问题,请参阅 COMSOL Mu…

idal 创建springboot 项目_SpringBoot教程:Maven方式创建SpringBoot项目

一.Maven方式创建Spring Boot项目1.配置Maven环境在以maven方式创建Spring Boot项目之前,请先确保自己的Maven并配置好环境变量,并且在ideal中关联好maven环境。2.创建一个新的maven项目3.设置项目坐标信息到此为止,就已经成功的…

mysql xa_Mysql对XA的支持

mysql8.0文档:https://dev.mysql.com/doc/refman/8.0/en/xa-statements.html。13.3.8.1 XA Transaction SQL Syntax章节讲述了Mysql对于XA事务的语法。XA {START|BEGIN} xid [JOIN|RESUME] XA END xid [SUSPEND [FOR MIGRATE]] XA PREPARE xid XA COMMIT xid [ONE P…

mysql 视图 过程 函数_MySQL视图,函数,触发器,存储过程

1. 视图视图是一个虚拟表,它的本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用【名称】即可获取结果集,可以将该结果集当做表来使用。使用视图我们可以把查询过程中的临时表摘出来,用视图去实现&…

socket抓包_64、抓包分析tcp与udp

从前面的两个案例,我们了解到了如何通过原生socket函数分别创建tcp和udp服务,以及通过相应的客户端进行连接测试。在本文中,我们将继续深入地去了解tcp和udp的差别,和思考它们两者如何应该多个客户端请求1、抓包分析这里采用tcpdu…

fw313r手机登录_迅捷(FAST)fw313r路由器手机设置教程

本文中,鸿哥主要给大家介绍,迅捷(FAST)fw313r路由器用手机设置的方法。一台新买回来的迅捷(FAST)fw313r路由器,要用手机来设置它连接Internet上网,需要以下几个步骤:1、正确连接FW313R路由器2、手机连接FW313R的信号3、…

mysql 5.6.21不能选择安装路径_mysql5.6.21服务器安装图解(选择安装和数据目录)

mysql安装图解(服务器上安装mysql,只安装mysql服务)1.3 mysql安装及配置版本:MySQL5.6.21 64位1.3.1 安装.net framework.exe 4.0注意:mysql5.6版本需要安装.net framwork.exe 4.0环境1.3.2 安装mysql数据库(1)打开安装程序后,…

爬空气质量MySQL_爬虫:利用selenium采集某某环境网站的空气质量数据

前言:在上一篇文章中,我们介绍了在http://PM2.5.in这个网站采集空气质量的数据,本篇文章是对其产生的一些问题的另一种解决方案,提供更加权威的数据采集。技术框架:selenium、json、etree这里的selenium是一种自动化测…

操作失败10秒内未完成启动服务mysql_01-MySQL 命令行-cmd用法-未完成

01.png02.png03.png04.png05.png06.png07.png08.png09.png一、mysql服务的启动和停止net stop mysqlnet start mysql二、登陆mysql语法如下: mysql -u用户名 -p用户密码键入命令mysql -uroot -p, 回车后提示你输入密码,输入12345,…

selenium python实例录制运行_WEB自动化测试工具selenium录制器使用笔记

简介selenium录制器是最近刚流行起来的一个WEB自动化测试工具,由多测测团队开发。Selenium录制器采用关键字驱动的理念,简化测试用例的创建和维护,可以直接运行在浏览器中,就像真正的用户在操作一样。自动化脚本录制、一键回放、报…