在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例


Posted in Python onJanuary 29, 2019

最近在工作中,遇到了数据合并、连接的问题,故整理如下,供需要者参考~

一、concat:沿着一条轴,将多个对象堆叠到一起

concat方法相当于数据库中的全连接(union all),它不仅可以指定连接的方式(outer join或inner join)还可以指定按照某个轴进行连接。与数据库不同的是,它不会去重,但是可以使用drop_duplicates方法达到去重的效果。

concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, 
    keys=None, levels=None, names=None, verify_integrity=False, copy=True):

pd.concat()只是单纯的把两个表拼接在一起,参数axis是关键,它用于指定是行还是列,axis默认是0。

当axis=0时,pd.concat([obj1, obj2])的效果与obj1.append(obj2)是相同的;当axis=1时,pd.concat([obj1, obj2], axis=1)的效果与pd.merge(obj1, obj2, left_index=True, right_index=True, how='outer')是相同的。

merge方法的介绍请参看下文。

参数介绍:

objs:需要连接的对象集合,一般是列表或字典;

axis:连接轴向;

join:参数为‘outer'或‘inner';

join_axes=[]:指定自定义的索引;

keys=[]:创建层次化索引;

ignore_index=True:重建索引

举例:

df1=DataFrame(np.random.randn(3,4),columns=['a','b','c','d']) 
 
df2=DataFrame(np.random.randn(2,3),columns=['b','d','a']) 
 
pd.concat([df1,df2]) 
 
     a     b     c     d 
0 -0.848557 -1.163877 -0.306148 -1.163944 
1 1.358759 1.159369 -0.532110 2.183934 
2 0.532117 0.788350 0.703752 -2.620643 
0 -0.316156 -0.707832    NaN -0.416589 
1 0.406830 1.345932    NaN -1.874817 
 
pd.concat([df1,df2],ignore_index=True) 
 
     a     b     c     d 
0 -0.848557 -1.163877 -0.306148 -1.163944 
1 1.358759 1.159369 -0.532110 2.183934 
2 0.532117 0.788350 0.703752 -2.620643 
3 -0.316156 -0.707832    NaN -0.416589 
4 0.406830 1.345932    NaN -1.874817

二、merge:通过键拼接列

类似于关系型数据库的连接方式,可以根据一个或多个键将不同的DatFrame连接起来。该函数的典型应用场景是,针对同一个主键存在两张不同字段的表,根据主键整合到一张表里面。

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, indicator=False)

参数介绍:

left和right:两个不同的DataFrame;

how:连接方式,有inner、left、right、outer,默认为inner;

on:指的是用于连接的列索引名称,必须存在于左右两个DataFrame中,如果没有指定且其他参数也没有指定,则以两个DataFrame列名交集作为连接键;

left_on:左侧DataFrame中用于连接键的列名,这个参数左右列名不同但代表的含义相同时非常的有用;

right_on:右侧DataFrame中用于连接键的列名;

left_index:使用左侧DataFrame中的行索引作为连接键;

right_index:使用右侧DataFrame中的行索引作为连接键;

sort:默认为True,将合并的数据进行排序,设置为False可以提高性能;

suffixes:字符串值组成的元组,用于指定当左右DataFrame存在相同列名时在列名后面附加的后缀名称,默认为('_x', '_y');

copy:默认为True,总是将数据复制到数据结构中,设置为False可以提高性能;

indicator:显示合并数据中数据的来源情况

举例:

# 1.默认以重叠的列名当做连接键。
df1=DataFrame({'key':['a','b','b'],'data1':range(3)})  
df2=DataFrame({'key':['a','b','c'],'data2':range(3)})  
pd.merge(df1,df2)  #没有指定连接键,默认用重叠列名,没有指定连接方式 
 
  data1 key data2 
0   0  a   0 
1   1  b   1 
2   2  b   1 
 
# 2.默认做inner连接(取key的交集),连接方式还有(left,right,outer),制定连接方式加参数:how=''
pd.merge(df2,df1) 
 
  data2 key data1 
0   0  a   0 
1   1  b   1 
2   1  b   2          #默认内连接,可以看见c没有连接上。 
 
pd.merge(df2,df1,how='left')  #通过how,指定连接方式 
 
  data2 key data1 
0   0  a   0 
1   1  b   1 
2   1  b   2 
3   2  c  NaN 
 
# 3.多键连接时将连接键组成列表传入,例:pd.merge(df1,df2,on=['key1','key2']
right=DataFrame({'key1':['foo','foo','bar','bar'], 
     'key2':['one','one','one','two'], 
     'lval':[4,5,6,7]}) 
left=DataFrame({'key1':['foo','foo','bar'], 
     'key2':['one','two','one'], 
     'lval':[1,2,3]}) 
right=DataFrame({'key1':['foo','foo','bar','bar'], 
     'key2':['one','one','one','two'], 
     'lval':[4,5,6,7]}) 
pd.merge(left,right,on=['key1','key2'],how='outer') #传出数组 
  
 key1 key2 lval_x lval_y 
0 foo one    1    4 
1 foo one    1    5 
2 foo two    2   NaN 
3 bar one    3    6 
4 bar two   NaN    7 
 
# 4.如果两个对象的列名不同,可以分别指定,例:pd.merge(df1,df2,left_on='lkey',right_on='rkey')
df3=DataFrame({'key3':['foo','foo','bar','bar'], #将上面的right的key 改了名字 
     'key4':['one','one','one','two'], 
     'lval':[4,5,6,7]}) 
pd.merge(left,df3,left_on='key1',right_on='key3') #键名不同的连接 
  
 key1 key2 lval_x key3 key4 lval_y 
0 foo one    1 foo one    4 
1 foo one    1 foo one    5 
2 foo two    2 foo one    4 
3 foo two    2 foo one    5 
4 bar one    3 bar one    6 
5 bar one    3 bar two    7

三、join:主要用于索引上的合并

join(self, other, on=None, how='left', lsuffix='', rsuffix='',sort=False):

其参数的意义与merge方法中的参数意义基本一样。

以上这篇在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现简单的HttpServer服务器示例
Sep 25 Python
使用requests库制作Python爬虫
Mar 25 Python
python自动化报告的输出用例详解
May 30 Python
tensorflow 打印内存中的变量方法
Jul 30 Python
python的scipy实现插值的示例代码
Nov 12 Python
Tensorflow: 从checkpoint文件中读取tensor方式
Feb 10 Python
idea2020手动安装python插件的实现方法
Jul 17 Python
Python字符串及文本模式方法详解
Sep 10 Python
pandas按照列的值排序(某一列或者多列)
Dec 13 Python
使用Python获取爱奇艺电视剧弹幕数据的示例代码
Jan 12 Python
史上最详细的Python打包成exe文件教程
Jan 17 Python
python实现一个简单的贪吃蛇游戏附代码
Jun 28 Python
对python numpy.array插入一行或一列的方法详解
Jan 29 #Python
对python中list的拷贝与numpy的array的拷贝详解
Jan 29 #Python
10 分钟快速入门 Python3的教程
Jan 29 #Python
解决python2 绘图title,xlabel,ylabel出现中文乱码的问题
Jan 29 #Python
解决python中画图时x,y轴名称出现中文乱码的问题
Jan 29 #Python
完美解决Python matplotlib绘图时汉字显示不正常的问题
Jan 29 #Python
通过python爬虫赚钱的方法
Jan 29 #Python
You might like
PHP的宝库目录--PEAR
2006/10/09 PHP
一个PHP日历程序
2006/12/06 PHP
在PHP中使用curl_init函数的说明
2010/11/02 PHP
PHP的fsockopen、pfsockopen函数被主机商禁用的解决办法
2014/07/08 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
2017/11/12 PHP
PHP常量DIRECTORY_SEPARATOR原理及用法解析
2020/11/10 PHP
Nodejs中session的简单使用及通过session实现身份验证的方法
2016/02/04 NodeJs
Javascript的表单验证-提交表单
2016/03/18 Javascript
javascript html5摇一摇功能的实现
2016/04/19 Javascript
jQuery使用ajax跨域获取数据的简单实例
2016/05/18 Javascript
JavaScript 字符串常用操作小结(非常实用)
2016/11/30 Javascript
常用的javascript设计模式
2017/01/11 Javascript
微信小程序 数据交互与渲染实例详解
2017/01/21 Javascript
NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】
2017/09/06 NodeJs
jQuery 实现倒计时天,时,分,秒功能
2018/07/31 jQuery
JavaScript选择排序算法原理与实现方法示例
2018/08/06 Javascript
Vue CLI3 如何支持less的方法示例
2018/08/29 Javascript
Node4-5静态资源服务器实战以及优化压缩文件实例内容
2019/08/29 Javascript
解决layer.msg 不居中 ifram中的问题
2019/09/05 Javascript
从零开始用webpack构建一个vue3.0项目工程的实现
2020/09/24 Javascript
在ironpython中利用装饰器执行SQL操作的例子
2015/05/02 Python
使用Python的Bottle框架写一个简单的服务接口的示例
2015/08/25 Python
python相似模块用例
2016/03/04 Python
Python三级菜单的实例
2017/09/13 Python
Python基于property实现类的特性操作示例
2018/06/15 Python
python调用tcpdump抓包过滤的方法
2018/07/18 Python
tensorflow之获取tensor的shape作为max_pool的ksize实例
2020/01/04 Python
HUGO BOSS美国官方网上商店:世界知名奢侈品牌
2017/08/04 全球购物
e路東瀛(JAPANiCAN)香港:日本旅游、日本酒店和温泉旅馆预订
2018/11/21 全球购物
UDP协议功能
2013/01/06 面试题
高中军训感言500字
2014/02/24 职场文书
团员年度个人总结
2015/02/26 职场文书
React 并发功能体验(前端的并发模式)
2021/07/01 Javascript
Python中文纠错的简单实现
2021/07/07 Python
MySQL数据库10秒内插入百万条数据的实现
2021/11/01 MySQL
mysql的Buffer Pool存储及原理
2022/04/02 MySQL