在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 Tkinter GUI编程入门介绍
Mar 10 Python
Python2.6版本中实现字典推导 PEP 274(Dict Comprehensions)
Apr 28 Python
python爬虫入门教程--利用requests构建知乎API(三)
May 25 Python
TensorFlow实现RNN循环神经网络
Feb 28 Python
python smtplib发送带附件邮件小程序
May 22 Python
举例讲解Python常用模块
Mar 08 Python
在pyqt5中QLineEdit里面的内容回车发送的实例
Jun 21 Python
python按行读取文件并找出其中指定字符串
Aug 08 Python
python中class的定义及使用教程
Sep 18 Python
python自动分箱,计算woe,iv的实例代码
Nov 22 Python
python迷宫问题深度优先遍历实例
Jun 20 Python
Python中re模块的元字符使用小结
Apr 07 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数组声明、遍历、数组全局变量使用小结
2013/06/05 PHP
浅析PHP中Session可能会引起并发问题
2015/07/23 PHP
laravel5.4生成验证码的实例讲解
2017/08/05 PHP
Javascript 错误处理的几种方法
2009/06/13 Javascript
如何让div span等元素能响应键盘事件操作指南
2012/11/13 Javascript
JS实现随机数生成算法示例代码
2013/08/08 Javascript
jQuery 鼠标经过(hover)事件的延时处理示例
2014/04/14 Javascript
js+jquery常用知识点汇总
2015/03/03 Javascript
JavaScript设置获取和设置属性的方法
2015/03/04 Javascript
基于jQuery实现select下拉选择可输入附源码下载
2016/02/03 Javascript
jQuery ajax应用总结
2016/06/02 Javascript
js使用i18n实现页面国际化的方法
2017/05/09 Javascript
JavaScript面试技巧之数组的一些不low操作
2019/03/22 Javascript
js module大战
2019/04/19 Javascript
微信小程序全局变量改变监听的实现方法
2019/07/15 Javascript
使用React代码动态生成栅格布局的方法
2020/05/24 Javascript
jQuery 移除事件的方法
2020/06/20 jQuery
全局安装 Vue cli3 和 继续使用 Vue-cli2.x操作
2020/09/08 Javascript
axios封装与传参示例详解
2020/10/18 Javascript
Python实现识别手写数字 Python图片读入与处理
2020/03/23 Python
使用memory_profiler监测python代码运行时内存消耗方法
2018/12/03 Python
在python里协程使用同步锁Lock的实例
2019/02/19 Python
Python操作SQLite数据库过程解析
2019/09/02 Python
python如何获取apk的packagename和activity
2020/01/10 Python
tensorflow获取预训练模型某层参数并赋值到当前网络指定层方式
2020/01/24 Python
加拿大著名时装品牌:SOIA & KYO
2016/08/23 全球购物
爱奇艺VIP会员:大剧抢先看
2018/07/11 全球购物
How TDD works
2012/09/30 面试题
新员工入职感言
2014/02/01 职场文书
小学生家长评语大全
2014/02/10 职场文书
入党申请自荐书范文
2014/02/11 职场文书
最新优秀教师个人先进事迹材料
2014/05/06 职场文书
利用前端HTML+CSS+JS开发简单的TODOLIST功能(记事本)
2021/04/13 Javascript
Springboot如何使用logback实现多环境配置?
2021/06/16 Java/Android
5道关于python基础 while循环练习题
2021/11/27 Python
基于Python实现流星雨效果的绘制
2022/03/18 Python