pandas实现数据合并的方法有哪些
Admin 2022-08-20 群英技术资讯 379 次浏览
#pandas 的 concat函数表达式如下 pd.concat( [df1, df2, df3], #指定需合并的两个或多个Dataframe,各个df的shape可以不同 axis = 0, #指定合并时,合并的轴方向,默认为0,即行合并,多个df会在纵向进行拼接合并 join = 'outer', #指定在合并轴方向的另外一个轴方向,标签如何合并,outer指取并集,inner指取交集 ignore_index = False, #指定是否保留原各个df在合并轴方向上的原有标签,默认False,即保留 keys = ['a','b','c'], #为合并后的数据,在合并轴方向上指定新的index,便于区分各个合并数据源 names = ['groupA','groupB'], #为 verify_integrity = False, #指定是否允许在指定的合并轴方向上,允许存在重复的标签,默认值为False,即允许,当指定为True时,如果有重复,在合并的时候会报错 )
#一般情况下,基本是在行方向将多个DataFrame进行连接合并,组成一个新的DataFrame,便于统一进行处理 #常见的应用场景,比如多个DataFrame可能有部分相同的列,希望连在一起,分析其规律 #df1数据源如下: A B C 0 0.214326 0.818321 -0.055211 1 -0.941666 2.396083 2.173411 #df2数据源如下: A B 0 0.397919 -0.350948 1 0.147547 -0.172974 pd.concat([df1 , df2], axis=0) #运算结果如下 A B C 0 -0.663727 1.883112 -0.409361 1 0.874930 -0.120000 0.015474 0 0.380397 -1.088665 NaN 1 -1.623468 0.610855 NaN pd.concat([df1 , df2], axis=1) #运算结果如下 A B C A B 0 -0.663727 1.883112 -0.409361 0.380397 -1.088665 1 0.874930 -0.120000 0.015474 -1.623468 0.610855
#一般直接使用join的默认值,即outer,取并集,此时不会丢弃多个DataFrame的任何列信息 #当然,如果想合并时,最后只留下多个DataFrame相同的列或行标签,则使用inner取交集 #df1数据源如下: A B C 0 0.214326 0.818321 -0.055211 1 -0.941666 2.396083 2.173411 #df2数据源如下: A B 0 0.397919 -0.350948 1 0.147547 -0.172974 pd.concat([df1 , df2], join = 'outer') #运算结果如下 A B C 0 -0.663727 1.883112 -0.409361 1 0.874930 -0.120000 0.015474 0 0.380397 -1.088665 NaN 1 -1.623468 0.610855 NaN pd.concat([df1 , df2], join = 'inner') #运算结果如下 A B 0 -0.663727 1.883112 1 0.874930 -0.120000 0 0.380397 -1.088665 1 -1.623468 0.610855
#该参数在希望对行进行遍历处理时,会比较有用,因为可以设置忽略合并轴方向之前的index或标签,重新进行生成,就像是一个全新的DataFrame一样 #df2数据源如下: A B C 0 0.214326 0.818321 -0.055211 1 -0.941666 2.396083 2.173411 #df2数据源如下: A B 0 0.397919 -0.350948 1 0.147547 -0.172974 pd.concat([df1,df2],ignore_index=True) #运算结果如下 A B C 0 -0.663727 1.883112 -0.409361 1 0.874930 -0.120000 0.015474 2 0.380397 -1.088665 NaN 3 -1.623468 0.610855 NaN pd.concat([df1,df2],ignore_index=False) #运算结果如下 A B C 0 -0.663727 1.883112 -0.409361 1 0.874930 -0.120000 0.015474 0 0.380397 -1.088665 NaN 1 -1.623468 0.610855 NaN
该参数类似于分组的效果
#该参数类似分组的效果,即沿着合并轴方向,按照合并的数据源,进行分组,便于区分合并数据来源 #df1数据源如下: A B C 0 0.214326 0.818321 -0.055211 1 -0.941666 2.396083 2.173411 #df2数据源如下: A B 0 0.397919 -0.350948 1 0.147547 -0.172974 pd.concat([df1,df2],keys=['a','b']) #运算结果如下 A B C a 0 -0.663727 1.883112 -0.409361 1 0.874930 -0.120000 0.015474 b 0 0.380397 -1.088665 NaN 1 -1.623468 0.610855 NaN
#该参数一般与keys一起使用,比如df1和df2是两个季度前两个月的数据,然后使用concat,将两个季度的合并成一个DataFrame,并且用keys指定每个季度的名称,再用names指定对应的含义 #df1数据源如下: A B C 0 0.214326 0.818321 -0.055211 1 -0.941666 2.396083 2.173411 #df2数据源如下: A B 0 0.397919 -0.350948 1 0.147547 -0.172974 pd.concat([df1,df2],keys=['第一季度','第二季度'],names = ['季度', '月份']) #运行结果如下 A B C 季度 月份 第一季度 0 -0.663727 1.883112 -0.409361 1 0.874930 -0.120000 0.015474 第二季度 0 0.380397 -1.088665 NaN 1 -1.623468 0.610855 NaN
#该参数只有在需要合并的数据,严格使用index或者列标签来区分数据的唯一性时,设置为True,才有意义 #否则,一般不设置就行,即默认False,此时合并时不会严格要求合并时index或列标签必须不同 #df1数据源如下: A B C 0 0.214326 0.818321 -0.055211 1 -0.941666 2.396083 2.173411 #df2数据源如下: A B 0 0.397919 -0.350948 1 0.147547 -0.172974 pd.concat([df1,df2],verify_integrity=True,axis=1) #报错,因df1和df2均有A、B列标签 pd.concat([df1,df2],verify_integrity=True,axis=0) #报错,因为df1和df2均有0、1的index
merge类似SQL中的连表操作,即通过两个DataFrame共有的列,作为key,将表在横向连接起来,主要用于拓展数据信息,比如多个DataFrame,均只记录了自己关心的完整数据的一部分,希望通过某一共同列,连表,最终形成较为完成的数据信息,是一种非常有用的连接方式
#merge函数基本表达式如下 pd.merge( df1,df2, #指定需要连接的两个DataFrame on='A', #指定连接时,以哪个列标签为准,进行连接,一般指定的列标签需要在两个df中均存在 how='outer', #指定数据如何连接,有outer、inner、right、left四种取值 left_on='A', #如果连接的两个df没有相同的列标签,可以分别指定不同的标签,用指定的两个标签来进行连接,此时需要left_on和right_on 均进行指定 right_on='B', left_index=True, #可设置以行index的值连接两个DataFrame,一般比较少用 right_index=True, suffixes=('_df1','_df2') #设置如果两个DataFrame有除了指定的on列,还有其他相同列标签时,为进行区分,在各自列后面添加后缀,默认是=('_x','_y') )
#left_on及right_on用法 #一般用在可能希望作为连接key的列标签一样时 #df1数据源为 姓名 年龄 0 张三 28 1 李四 31 #df2数据源为 姓名 性别 职业 0 张三 男 IT 1 李四 女 运营 pd.merge(df1 ,df2, on='姓名') #运算结果如下 姓名 年龄 性别 职业 0 张三 28 男 IT 1 李四 31 女 运营 #以上等同于pd.merge(df1,df2),或者df1.merge(df2) #left_on及right_on用法 #一般用在可能希望作为连接key的列标签不一样时,使用 #df1数据源为 姓名 性别 职业 0 张三 男 IT 1 李四 女 运营 #df2数据源为 员工姓名 婚姻状况 学历 0 张三 未婚 本科 1 李四 已婚 研究生 pd.merge(df1, df2, left_on='姓名', right_on='员工姓名') #运算结果如下 姓名 性别 职业 员工姓名 婚姻状况 学历 0 张三 男 IT 张三 未婚 本科 1 李四 女 运营 李四 已 婚 研究生
#how参数决定了将如何用on指定的key对两个DataFrame进行连接,主要是比对on指定的两个df的列标签, #如果取并集,则是outer,即连接后的Df会包含两个df所有的key值;如果取交集,则是inner,即连接后的df只会包含两个df均有的key值 #如果需要保证左边df的key值必须有,右边的不一定,则是left;如果需要保证右边df的key值必须有,左边的不一定,则是right #df1数据源如下 姓名 性别 职业 0 张三 男 IT 1 李四 女 运营 #df2数据源如下 姓名 婚姻状况 学历 0 张三 未婚 本科 1 李四 已婚 研究生 2 王五 未婚 博士 3 麻子 已婚 研究生 pd.merge(df1 , df2, how='outer') #运算结果如下 姓名 性别 职业 婚姻状况 学历 0 张三 男 IT 未婚 本科 1 李四 女 运营 已婚 研究生 2 王五 NaN NaN 未婚 博士 3 麻子 NaN NaN 已婚 研究生 pd.merge(df1, df2, how='inner') #运算结果如下 姓名 性别 职业 婚姻状况 学历 0 张三 男 IT 未婚 本科 1 李四 女 运营 已婚 研究生 pd.merge(df1, df2, how='left') #运算结果如下 姓名 性别 职业 婚姻状况 学历 0 张三 男 IT 未婚 本科 1 李四 女 运营 已婚 研究生 pd.merge(df1, df2, how='right') #运算结果如下 姓名 性别 职业 婚姻状况 学历 0 张三 男 IT 未婚 本科 1 李四 女 运营 已婚 研究生 2 王五 NaN NaN 未婚 博士 3 麻子 NaN NaN 已婚 研究生
#merge一般用于key为列标签时,对两个df进行链接,类似SQL中的连表操作,不过如果需要,也可以使用行的index作为key进行连表 #left_index、right_index,类似于left_on和right_on,这四个可以left和right两两结合,比如df1的index其实就是df2的列的key,此时便可以使用left_index=True,right_on='B',或者直接对两个df用index进行连表 #df1数据源如下 姓名 性别 职业 0 张三 男 IT 1 李四 女 运营 #df2数据源如下 姓名 婚姻状况 学历 0 张三 未婚 本科 1 李四 已婚 研究生 2 王五 未婚 博士 3 麻子 已婚 研究生 pd.merge(df1, df2, left_index=True, right_index=True #运算结果如下 姓名_x 性别 职业 姓名_y 婚姻状况 学历 0 张三 男 IT 张三 未婚 本科 1 李四 女 运营 李四 已婚 研究生
#如果连接的两个df,除了key列,或者on指定的列外,还有相同的列标签,为了进行区分,pd会自动在相同的列标签分别添加后缀,默认是x、y,也可通过suffixes显示指定 #df1数据源 姓名 性别 职业 0 张三 男 IT 1 李四 女 运营 #df2数据源 姓名 职业 婚姻状况 学历 0 张三 IT 未婚 本科 1 李四 运营 已婚 研究生 2 王五 产品 未婚 博士 3 麻子 市场 已婚 研究生 pd.merge(df1, df2, on='姓名',how='outer',suffixes=('_表1','_表2')) #运算结果如下 姓名 性别 职业_表1 职业_表2 婚姻状况 学历 0 张三 男 IT IT 未婚 本科 1 李四 女 运营 运营 已婚 研究生 2 王五 NaN NaN 产品 未婚 博士 3 麻子 NaN NaN 市场 已婚 研究生
join整体功能与merge类似,也与SQL中的join语法功能和表现完全一样,只不过join可以高效的连接多个DataFrame,而merge只能连接两个,相当于join的快捷方式,join连接时默认使用行index进行连接,但也可以指定类似merge使用列标签连表。
#join函数的使用方法如下 DataFrame.join( other, #指定需要连接的其他df,如果是一个,则直接写df,如果是多个,则可以是多个df组成的列表或元组,如果是多个,则不支持设置on、lsuffix以及sort on=None, #默认以行index连接,也可以指定列标签,如果需要指定多个列,则可以是列表或元组形式 how='left', #连接的方式,枚举为 left、right、outer、inner,默认是left lsuffix=' ', #左df重复列的后缀,只对连接2个df有效,连接多个df如果列标签有重复,则会报错 rsuffix=' ', #右df重复列的后缀,只对连接2个df有效,连接多个df如果列标签有重复,则会报错 sort=False #排序,按照字典顺序对结果在连接键上排序。如果为False,连接键的顺序取决于连接类型(关键字) )
#默认join以行索引index连接,如果多个df没有重复的列标签,则可以直接进行连接,无需设置其他参数 #此时,也可以一次性连接多个df, #df1数据源 姓名 性别 0 张三 男 1 李四 女 #df2数据源 职业 婚姻状况 0 IT 未婚 1 运营 已婚 df1.join(df2) #运算结果如下 姓名 性别 职业 婚姻状况 0 张三 男 IT 未婚 1 李四 女 运营 已婚
#当有重复列标签时,必须设置lsuffix和rsuffix参数,否则就会报错 #df1数据源 姓名 性别 0 张三 男 1 李四 女 #df2数据源 姓名 职业 婚姻状况 0 张三 IT 未婚 1 李四 运营 已婚 df1.join(df2, lsuffix='_a', rsuffix='_b') #运算结果如下 姓名_a 性别 姓名_b 职业 婚姻状况 0 张三 男 张三 IT 未婚 1 李四 女 李四 运营 已婚
#类似merge,如果想链接的两个df,可能列标签没有相同,但是某列标签内容有相同,希望用该列作为Key进行连表,则可以分别设置左右on的key #df1数据源 姓名 性别 0 张三 男 1 李四 女 #df2数据源 员工姓名 职业 婚姻状况 0 张三 IT 未婚 1 李四 运营 已婚 2 王五 运营 已婚 df1.join(df2.set_index('员工姓名'),on='姓名') #运算结果如下 姓名 性别 职业 婚姻状况 0 张三 男 IT 未婚 1 李四 女 运营 已婚
#以列标签连表,就类似merge默认的用法,如果除了on指定的列标签,两个df还有其他相同的列标签,则lsuffix和rsuffix必须设置,否则会报错 #df1数据源 姓名 性别 0 张三 男 1 李四 女 #df2数据源 姓名 职业 婚姻状况 0 张三 IT 未婚 1 李四 运营 已婚 2 王五 运营 已婚 df1.join(df2.set_index('姓名'),on='姓名') #运算结果如下 姓名 性别 职业 婚姻状况 0 张三 男 IT 未婚 1 李四 女 运营 已婚
此时,无法使用列标签连接两个DataFrame
相同点:
不同点:
该方法主要是对存量的DataFrame添加新的行,或者直接将另外一个DataFrame按0轴(按行)合并到现有的DataFrame上,并且要求两个DataFrame的列数完全相等
该方法在比如需要对多个列数相同的数据进行合并分析时较为有用,不过直接使用pd.concat(df1,df2)也能达到目的,只是append用法可能更为直观些
import pandas as pd #df1数据源如下 A B 0 -0.606787 0.256638 1 -1.333439 -0.335560 #df2数据源如下 A B 0 -0.606787 0.256638 1 -1.333439 -0.335560 df1.append(df2) #运算结果如下: A B 0 0.966491 -0.316075 1 -0.298886 1.016128 0 0.592691 0.478276 1 1.117325 1.294424 #其实以上方法,效果等同于concat的默认行为 pd.concat(df1,df2)
该方法主要是对存量的DataFrame添加新的列,并且要求新增的列,对应的Series长度需与存量数据相同
该方法用的比较少,因为如果想增加新的列,有更快捷的方式,此处只是罗列说明
#df源数据如下 A B 0 -0.606787 0.256638 1 -1.333439 -0.335560 df.assign(C=[1,2]) #结果如下: A B C 0 -0.606787 0.256638 1 1 -1.333439 -0.335560 2 #以上操作等同于如下操作,并且相对来说更加直观 df['C']=[1,2]
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
今天通过本文给大家分享openstack中的rpc远程调用的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
Flask诞生于愚人节开的一个玩笑,后来逐渐发展成为一个成熟的 Python Web框架,越来越受到开发者的喜爱。本文将以一个博客后台为例,详解Flask框架的安装及应用,需要的可以参考一下
目录泰勒展开与e的求法python和神奇的decimal计算比较完整代码泰勒展开与e的求法大家伙儿知道计算机里的 e是怎么求出来的吗?这还要从神奇的泰勒展开讲起……简
json.dumps将一个Python数据结构转换为JSON,本文介绍了Python中json.dumps()函数的具体使用方法,以及和dump的区别,感兴趣的可以了解一下
本文主要介绍了python读取matlab数据,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008