详解PANDAS 数据合并与重塑(join/merge篇)


Posted in Python onJuly 09, 2019

在上一篇文章中,我整理了pandas在数据合并和重塑中常用到的concat方法的使用说明。在这里,将接着介绍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 数据合并与重塑(join/merge篇) 

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

how的方法有:

left

只保留左表的所有数据

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

详解PANDAS 数据合并与重塑(join/merge篇)

right

只保留右表的所有数据

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

详解PANDAS 数据合并与重塑(join/merge篇)

outer

保留两个表的所有信息

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

详解PANDAS 数据合并与重塑(join/merge篇)

inner

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

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

详解PANDAS 数据合并与重塑(join/merge篇)

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 数据合并与重塑(join/merge篇)

1.3.3 suffix后缀参数

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

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

详解PANDAS 数据合并与重塑(join/merge篇)

* 另外还有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 数据合并与重塑(join/merge篇)

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则会更新左表的所有能在右表中找到的值(两表位置相对应)。

示例代码参考来源——官网

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Django的数据模型访问多对多键值的方法
Jul 21 Python
Python制作简单的网页爬虫
Nov 22 Python
Python批量创建迅雷任务及创建多个文件
Feb 13 Python
Python中import导入上一级目录模块及循环import问题的解决
Jun 04 Python
Python面向对象特殊成员
Apr 24 Python
Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】
Sep 28 Python
python实现dijkstra最短路由算法
Jan 17 Python
Python求一批字符串的最长公共前缀算法示例
Mar 02 Python
对Python生成器、装饰器、递归的使用详解
Jul 19 Python
Python xlrd模块导入过程及常用操作
Jun 10 Python
Python Celery异步任务队列使用方法解析
Aug 10 Python
python 获取计算机的网卡信息
Feb 18 Python
python 返回一个列表中第二大的数方法
Jul 09 #Python
Mac在python3环境下安装virtualwrapper遇到的问题及解决方法
Jul 09 #Python
Python3中的最大整数和最大浮点数实例
Jul 09 #Python
详解pandas数据合并与重塑(pd.concat篇)
Jul 09 #Python
python自定义函数实现最大值的输出方法
Jul 09 #Python
mac系统下Redis安装和使用步骤详解
Jul 09 #Python
使用python将多个excel文件合并到同一个文件的方法
Jul 09 #Python
You might like
php中在PDO中使用事务(Transaction)
2011/05/14 PHP
Yii结合CKEditor实现图片上传功能
2014/06/13 PHP
ThinkPHP之A方法实例讲解
2014/06/20 PHP
ThinkPHP实现静态缓存和动态缓存示例代码
2017/05/02 PHP
PHP实现登陆并抓取微信列表中最新一组微信消息的方法
2017/07/10 PHP
thinkPHP5项目中实现QQ第三方登录功能
2017/10/20 PHP
php处理抢购类功能的高并发请求
2018/02/08 PHP
MacOS下PHP7.1升级到PHP7.4.15的方法
2021/02/22 PHP
JavaScript入门学习书籍推荐
2008/06/12 Javascript
为超链接加上disabled后的故事
2010/12/10 Javascript
JS返回上一页实例代码通过图片和按钮分别实现
2013/08/16 Javascript
jQuery知识点整理
2015/01/30 Javascript
基于Node.js的强大爬虫 能直接发布抓取的文章哦
2016/01/10 Javascript
神奇!js+CSS+DIV实现文字颜色渐变效果
2016/03/16 Javascript
JS 通过系统时间限定动态添加 select option的实例代码
2016/06/09 Javascript
Bootstrap模态框禁用空白处点击关闭
2016/10/20 Javascript
Jquery EasyUI Datagrid右键菜单实现方法
2016/12/30 Javascript
JS简单获得节点元素的方法示例
2018/02/10 Javascript
Vue.js 父子组件通信的十种方式
2018/10/30 Javascript
Layui带搜索的下拉框的使用以及动态数据绑定方法
2019/09/28 Javascript
[02:33]2018 DOTA2亚洲邀请赛回顾视频 再次拾起那些美妙的时刻
2018/04/10 DOTA
[02:46]完美世界DOTA2联赛PWL DAY4集锦
2020/11/03 DOTA
Python面向对象之继承和组合用法实例分析
2018/08/27 Python
python 设置输出图像的像素大小方法
2019/07/04 Python
python 控制台单行刷新,多行刷新实例
2020/02/19 Python
使用jupyter notebook直接打开.md格式的文件
2020/04/10 Python
浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置
2020/06/30 Python
Matplotlib中%matplotlib inline如何使用
2020/07/28 Python
css3 图片圆形显示 如何CSS将正方形图片显示为圆形图片布局
2014/10/10 HTML / CSS
美国维生素、补充剂、保健食品购物网站:Vitacost
2016/08/05 全球购物
德国狗狗用品在线商店:Schecker
2017/03/17 全球购物
斯洛伐克家具和时尚装饰品购物网站:Butlers.sk
2019/09/08 全球购物
Linux内核产生并发的原因
2012/07/13 面试题
网络工程与软件技术毕业生自荐信
2013/09/24 职场文书
2015年体育部工作总结
2015/04/02 职场文书
Python基础之Socket通信原理
2021/04/22 Python