pandas中DataFrame数据合并连接(merge、join、concat)


Posted in Python onMay 30, 2021

pandas作者Wes McKinney 在【PYTHON FOR DATA ANALYSIS】中对pandas的方方面面都有了一个权威简明的入门级的介绍,但在实际使用过程中,我发现书中的内容还只是冰山一角。谈到pandas数据的行更新、表合并等操作,一般用到的方法有concat、join、merge。但这三种方法对于很多新手来说,都不太好分清使用的场合与用途。今天就pandas官网中关于数据合并和重述的章节做个使用方法的总结。

文中代码块主要有pandas官网教程提供。

1 concat

concat函数是在pandas底下的方法,可以将数据根据不同的轴作简单的融合

pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,
       keys=None, levels=None, names=None, verify_integrity=False)

参数说明 

objs: series,dataframe或者是panel构成的序列lsit 

axis: 需要合并链接的轴,0是行,1是列 

join:连接的方式 inner,或者outer

其他一些参数不常用,用的时候再补上说明。

1.1 相同字段的表首尾相接

pandas中DataFrame数据合并连接(merge、join、concat)

# 现将表构成list,然后在作为concat的输入
In [4]: frames = [df1, df2, df3]
 
In [5]: result = pd.concat(frames)

要在相接的时候在加上一个层次的key来识别数据源自于哪张表,可以增加key参数

In [6]: result = pd.concat(frames, keys=['x', 'y', 'z'])

效果如下

pandas中DataFrame数据合并连接(merge、join、concat)

1.2 横向表拼接(行对齐)

1.2.1 axis

当axis = 1的时候,concat就是行对齐,然后将不同列名称的两张表合并

In [9]: result = pd.concat([df1, df4], axis=1)

pandas中DataFrame数据合并连接(merge、join、concat)

1.2.2 join

加上join参数的属性,如果为'inner'得到的是两表的交集,如果是outer,得到的是两表的并集。

In [10]: result = pd.concat([df1, df4], axis=1, join='inner')

pandas中DataFrame数据合并连接(merge、join、concat)

1.2.3 join_axes

如果有join_axes的参数传入,可以指定根据那个轴来对齐数据 

例如根据df1表对齐数据,就会保留指定的df1表的轴,然后将df4的表与之拼接

In [11]: result = pd.concat([df1, df4], axis=1, join_axes=[df1.index])

pandas中DataFrame数据合并连接(merge、join、concat)1.3

1.3 append

append是series和dataframe的方法,使用它就是默认沿着列进行凭借(axis = 0,列对齐)

In [12]: result = df1.append(df2)

pandas中DataFrame数据合并连接(merge、join、concat)

1.4 无视index的concat

如果两个表的index都没有实际含义,使用ignore_index参数,置true,合并的两个表就睡根据列字段对齐,然后合并。最后再重新整理一个新的index。 

pandas中DataFrame数据合并连接(merge、join、concat)

1.5 合并的同时增加区分数据组的键

前面提到的keys参数可以用来给合并后的表增加key来区分不同的表数据来源

1.5.1 可以直接用key参数实现

In [27]: result = pd.concat(frames, keys=['x', 'y', 'z'])

pandas中DataFrame数据合并连接(merge、join、concat)

1.5.2 传入字典来增加分组键

In [28]: pieces = {'x': df1, 'y': df2, 'z': df3}
 
In [29]: result = pd.concat(pieces)

pandas中DataFrame数据合并连接(merge、join、concat)

1.6 在dataframe中加入新的行

append方法可以将 series 和 字典就够的数据作为dataframe的新一行插入。 

pandas中DataFrame数据合并连接(merge、join、concat)

In [34]: s2 = pd.Series(['X0', 'X1', 'X2', 'X3'], index=['A', 'B', 'C', 'D'])
 
In [35]: result = df1.append(s2, ignore_index=True)

 表格列字段不同的表合并

如果遇到两张表的列字段本来就不一样,但又想将两个表合并,其中无效的值用nan来表示。那么可以使用ignore_index来实现。

1

pandas中DataFrame数据合并连接(merge、join、concat)

In [36]: dicts = [{'A': 1, 'B': 2, 'C': 3, 'X': 4},
   ....:          {'A': 5, 'B': 6, 'C': 7, 'Y': 8}]
   ....: 
 
In [37]: result = df1.append(dicts, ignore_index=True)

在这里,将接着介绍pandas中也常常用到的join 和merge方法

merge

pandas的merge方法提供了一种类似于SQL的内存链接操作,官网文档提到它的性能会比其他开源语言的数据操作(例如R)要高效。

和SQL语句的对比可以看这里

merge的参数

on:列名,join用来对齐的那一列的名字,用到这个参数的时候一定要保证左表和右表用来对齐的那一列都有相同的列名。

left_on:左表对齐的列,可以是列名,也可以是和dataframe同样长度的arrays。

right_on:右表对齐的列,可以是列名,也可以是和dataframe同样长度的arrays。

left_index/ right_index: 如果是True的haunted以index作为对齐的key

how:数据融合的方法。

sort:根据dataframe合并的keys按字典顺序排序,默认是,如果置false可以提高表现。

merge的默认合并方法:

    merge用于表内部基于 index-on-index 和 index-on-column(s) 的合并,但默认是基于index来合并。

1.1 复合key的合并方法

使用merge的时候可以选择多个key作为复合可以来对齐合并。

 1.1.1 通过on指定数据合并对齐的列

In [41]: left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
   ....:                      'key2': ['K0', 'K1', 'K0', 'K1'],
   ....:                      'A': ['A0', 'A1', 'A2', 'A3'],
   ....:                      'B': ['B0', 'B1', 'B2', 'B3']})
   ....: 
 
In [42]: right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
   ....:                       'key2': ['K0', 'K0', 'K0', 'K0'],
   ....:                       'C': ['C0', 'C1', 'C2', 'C3'],
   ....:                       'D': ['D0', 'D1', 'D2', 'D3']})
   ....: 
 
In [43]: result = pd.merge(left, right, on=['key1', 'key2'])

pandas中DataFrame数据合并连接(merge、join、concat) 

没有指定how的话默认使用inner方法。

how的方法有:

left

只保留左表的所有数据

In [44]: result = pd.merge(left, right, how='left', on=['key1', 'key2'])

pandas中DataFrame数据合并连接(merge、join、concat)

right

只保留右表的所有数据

In [45]: result = pd.merge(left, right, how='right', on=['key1', 'key2'])

pandas中DataFrame数据合并连接(merge、join、concat)

outer

保留两个表的所有信息

In [46]: result = pd.merge(left, right, how='outer', on=['key1', 'key2'])

pandas中DataFrame数据合并连接(merge、join、concat)

inner

只保留两个表中公共部分的信息

In [47]: result = pd.merge(left, right, how='inner', on=['key1', 'key2'])

pandas中DataFrame数据合并连接(merge、join、concat)

1.2 indicator

v0.17.0 版本的pandas开始还支持一个indicator的参数,如果置True的时候,输出结果会增加一列 ' _merge'。_merge列可以取三个值

  • left_only 只在左表中
  • right_only 只在右表中
  • both 两个表中都有

1.3 join方法

dataframe内置的join方法是一种快速合并的方法。它默认以index作为对齐的列。

1.3.1 how 参数

join中的how参数和merge中的how参数一样,用来指定表合并保留数据的规则。

具体可见前面的 how 说明。

1.3.2 on 参数

在实际应用中如果右表的索引值正是左表的某一列的值,这时可以通过将 右表的索引 和 左表的列 对齐合并这样灵活的方式进行合并。

ex 1

In [59]: left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
   ....:                      'B': ['B0', 'B1', 'B2', 'B3'],
   ....:                      'key': ['K0', 'K1', 'K0', 'K1']})
   ....: 
 
In [60]: right = pd.DataFrame({'C': ['C0', 'C1'],
   ....:                       'D': ['D0', 'D1']},
   ....:                       index=['K0', 'K1'])
   ....: 
 
In [61]: result = left.join(right, on='key')

pandas中DataFrame数据合并连接(merge、join、concat)

1.3.3 suffix后缀参数

如果和表合并的过程中遇到有一列两个表都同名,但是值不同,合并的时候又都想保留下来,就可以用suffixes给每个表的重复列名增加后缀。

In [79]: result = pd.merge(left, right, on='k', suffixes=['_l', '_r'])

pandas中DataFrame数据合并连接(merge、join、concat)

* 另外还有lsuffix 和 rsuffix分别指定左表的后缀和右表的后缀。

1.4 组合多个dataframe

一次组合多个dataframe的时候可以传入元素为dataframe的列表或者tuple。一次join多个,一次解决多次烦恼~

In [83]: right2 = pd.DataFrame({'v': [7, 8, 9]}, index=['K1', 'K1', 'K2'])
 
In [84]: result = left.join([right, right2])

pandas中DataFrame数据合并连接(merge、join、concat)

1.5 更新表的nan值

1.5.1 combine_first

如果一个表的nan值,在另一个表相同位置(相同索引和相同列)可以找到,则可以通过combine_first来更新数据

1.5.2 update

如果要用一张表中的数据来更新另一张表的数据则可以用update来实现

1.5.3 combine_first 和 update 的区别

使用combine_first会只更新左表的nan值。而update则会更新左表的所有能在右表中找到的值(两表位置相对应)。

总结

到此这篇关于pandas中DataFrame 数据合并连接(merge、join、concat)的文章就介绍到这了,更多相关pandas中DataFrame 数据合并内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python 基础学习第二弹 类属性和实例属性
Aug 27 Python
python模拟登陆阿里妈妈生成商品推广链接
Apr 03 Python
python在linux中输出带颜色的文字的方法
Jun 19 Python
python实现的系统实用log类实例
Jun 30 Python
使用Mixin设计模式进行Python编程的方法讲解
Jun 21 Python
python实现人民币大写转换
Jun 20 Python
详解Python logging调用Logger.info方法的处理过程
Feb 12 Python
Python动态参数/命名空间/函数嵌套/global和nonlocal
May 29 Python
Python 实现数据结构-循环队列的操作方法
Jul 17 Python
python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)
Mar 09 Python
Keras自定义实现带masking的meanpooling层方式
Jun 16 Python
Python函数中apply、map、applymap的区别
Nov 27 Python
Pandas加速代码之避免使用for循环
pandas提升计算效率的一些方法汇总
May 30 #Python
Python一行代码实现自动发邮件功能
深入解析NumPy中的Broadcasting广播机制
python必学知识之文件操作(建议收藏)
Python使用Kubernetes API访问集群
如何利用pygame实现打飞机小游戏
You might like
PHP5.0正式发布 不完全兼容PHP4 新增多项功能
2006/10/09 PHP
PHP获取浏览器信息类和客户端地理位置的2个方法
2014/04/24 PHP
php数组查找函数in_array()、array_search()、array_key_exists()使用实例
2014/04/29 PHP
ASP和PHP实现生成网站快捷方式并下载到桌面的方法
2014/05/08 PHP
浅谈PHP拦截器之__set()与__get()的理解与使用方法
2016/10/18 PHP
如何修改Laravel中url()函数生成URL的根地址
2017/08/11 PHP
Laravel5.7 数据库操作迁移的实现方法
2019/04/12 PHP
JavaScript DOM 学习第五章 表单简介
2010/02/19 Javascript
如何使用Jquery获取Form表单中被选中的radio值
2013/08/09 Javascript
jQuery中insertAfter()方法用法实例
2015/01/08 Javascript
深入理解JavaScript系列(18):面向对象编程之ECMAScript实现
2015/03/05 Javascript
理解 JavaScript Scoping & Hoisting(二)
2015/11/18 Javascript
JavaScript Promise 用法
2016/06/14 Javascript
js实现可输入可选择的select下拉框
2016/12/21 Javascript
JS实现发送短信验证后按钮倒计时功能(防止刷新倒计时失效)
2017/07/07 Javascript
详解JSONObject和JSONArray区别及基本用法
2017/10/25 Javascript
使用JSON格式提交数据到服务端的实例代码
2018/04/01 Javascript
微信小程序实现列表滚动头部吸顶的示例代码
2020/07/12 Javascript
Vue.js暴露方法给WebView的使用操作
2020/09/07 Javascript
python3爬取各类天气信息
2018/02/24 Python
Python面向对象之类和实例用法分析
2019/06/08 Python
Apache部署Django项目图文详解
2019/07/30 Python
python set集合使用方法解析
2019/11/05 Python
python词云库wordCloud使用方法详解(解决中文乱码)
2020/02/17 Python
keras的三种模型实现与区别说明
2020/07/03 Python
完美解决TensorFlow和Keras大数据量内存溢出的问题
2020/07/03 Python
python自动化办公操作PPT的实现
2021/02/05 Python
css3中用animation的steps属性制作帧动画
2019/04/25 HTML / CSS
周鸿祎:教你写创业计划书
2013/12/30 职场文书
中学劳技课教师的自我评价
2014/02/05 职场文书
视光学毕业生自荐书范文
2014/02/13 职场文书
2014年党支部承诺书
2014/05/30 职场文书
节水宣传标语口号
2015/12/26 职场文书
医学生自荐信范文(2016精选篇)
2016/01/28 职场文书
浅谈Web Storage API的使用
2021/06/23 Javascript
IDEA2021.2配置docker如何将springboot项目打成镜像一键发布部署
2021/09/25 Java/Android