pandas合并和连接多个数据框 | 您所在的位置:网站首页 › pandas把重复列名合并 › pandas合并和连接多个数据框 |
欢迎关注”生信修炼手册”! pandas作为数据分析的利器,提供了数据读取,数据清洗,数据整形等一系列功能。当需要对多个数据集合并处理时,我们就需要对多个数据框进行连接操作,在pandas中,提供了以下多种实现方式 1. concat concat函数可以在行和列两个水平上灵活的合并多个数据框,基本用法如下 >>> import numpy as np >>> import pandas as pd >>> a = pd.DataFrame(np.random.randn(2,2),columns=['A','B']) >>> a A B 0 -1.809098 -0.405398 1 0.375546 -1.382664 >>> b = pd.DataFrame(np.random.randn(3,3),columns=['A','B', 'C']) >>> b A B C 0 -0.829604 1.090541 0.749220 1 -0.889822 2.227603 -1.211428 2 -1.824889 -0.687067 0.012370 >>> pd.concat([a, b]) A B C 0 -1.809098 -0.405398 NaN 1 0.375546 -1.382664 NaN 0 -0.829604 1.090541 0.749220 1 -0.889822 2.227603 -1.211428 2 -1.824889 -0.687067 0.012370默认情况下,以行的方式合并多个数据框,对于子数据框中没有的列,以NaN进行填充。 concat函数有多个参数,通过修改参数的值,可以实现灵活的数据框合并。首先是axis参数,从numpy延伸而来的一个概念。对于一个二维的数据框而言,行为0轴, 列为1轴。该参数的默认值为0, 以行的方式进行合并,当设置为1时,表示以列的方式进行合并,示例如下 >>> pd.concat([a, b], axis = 0) A B C 0 -1.809098 -0.405398 NaN 1 0.375546 -1.382664 NaN 0 -0.829604 1.090541 0.749220 1 -0.889822 2.227603 -1.211428 2 -1.824889 -0.687067 0.012370 >>> pd.concat([a, b], axis = 1) A B A B C 0 -1.809098 -0.405398 -0.829604 1.090541 0.749220 1 0.375546 -1.382664 -0.889822 2.227603 -1.211428 2 NaN NaN -1.824889 -0.687067 0.012370观察上述的结果可以发现,合并数据框时,对于不同shape的数据框,尽管行标签和列标签有重复值,但是都是当做独立元素来处理,直接取了并集,这个行为实际上由join参数控制,默认值为outer。合并数据框时,沿着axis参数指定的轴进行合并,而join参数则控制在另外一个轴上,标签如何处理,默认的outer表示取并集,取值为inner时,取交集,只保留overlap的标签,示例如下 >>> pd.concat([a, b], join = "outer") A B C 0 -1.809098 -0.405398 NaN 1 0.375546 -1.382664 NaN 0 -0.829604 1.090541 0.749220 1 -0.889822 2.227603 -1.211428 2 -1.824889 -0.687067 0.012370 >>> pd.concat([a, b], join = "inner") A B 0 -1.809098 -0.405398 1 0.375546 -1.382664 0 -0.829604 1.090541 1 -0.889822 2.227603 2 -1.824889 -0.687067ignore_index参数表示忽略在axis参数指定的轴上的原有标签,默认值为False, 保留原有的标签,示例如下 # 保留原有的行标签 >>> pd.concat([a, b], ignore_index = False) A B C 0 -1.809098 -0.405398 NaN 1 0.375546 -1.382664 NaN 0 -0.829604 1.090541 0.749220 1 -0.889822 2.227603 -1.211428 2 -1.824889 -0.687067 0.012370 # 用从0开始的数字作为新的行标签 >>> pd.concat([a, b], ignore_index = True) A B C 0 -1.809098 -0.405398 NaN 1 0.375546 -1.382664 NaN 2 -0.829604 1.090541 0.749220 3 -0.889822 2.227603 -1.211428 4 -1.824889 -0.687067 0.012370keys参数指定指定一个新的index, 用来区分不同的子数据框,示例如下 >>> pd.concat([a, b], keys = ['a', 'b']) A B C a 0 -1.809098 -0.405398 NaN 1 0.375546 -1.382664 NaN b 0 -0.829604 1.090541 0.749220 1 -0.889822 2.227603 -1.211428 2 -1.824889 -0.687067 0.012370names参数为index设置名称, 示例如下 >>> pd.concat([a, b], keys = ['a', 'b'], names = ['groupA', 'groupB']) A B C groupA groupB a 0 -1.809098 -0.405398 NaN 1 0.375546 -1.382664 NaN b 0 -0.829604 1.090541 0.749220 1 -0.889822 2.227603 -1.211428 2 -1.824889 -0.687067 0.012370verify_integrity参数默认值为False, 允许axis参数指定的轴上有重复的标签,当指定为False时,如果存在重复的标签,则会报错,示例如下 >>> pd.concat([a, b], verify_integrity=False)) A B C 0 -1.809098 -0.405398 NaN 1 0.375546 -1.382664 NaN 0 -0.829604 1.090541 0.749220 1 -0.889822 2.227603 -1.211428 2 -1.824889 -0.687067 0.012370 >>> pd.concat([a, b], verify_integrity=True) ... ValueError: Indexes have overlapping values: Int64Index([0, 1], dtype='int64')2. merge merge以SQL数据库类似的合并逻辑,来合并两个数据框。在SQL数据库中,每个数据表有一个主键,称之为key, 通过比较主键的内容,将两个数据表进行连接,基本用法如下 >>> a = pd.DataFrame({'name':['Rose', 'Andy', 'July'],'age':[21,22,18]}) >>> a name age 0 Rose 21 1 Andy 22 2 July 18 >>> b = pd.DataFrame({'name':['Rose', 'Andy', 'Jack'],'height':[172,168,175],'weight':[45,55,75]}) >>> b name height weight 0 Rose 172 45 1 Andy 168 55 2 Jack 175 75 >>> >>> a.merge(b) name age height weight 0 Rose 21 172 45 1 Andy 22 168 55默认情况下,会寻找标签名字相同的列作为key, 然后比较两个数据框中key列对应的元素,取交集的元素作为合并的对象。 通过on参数,可以显示的指定作为key的标签名称,注意用on参数指定的标签名称,必须在两个数据框中同时存在才行,用法如下 >>> a.merge(b, on='name') name age height weight 0 Rose 21 172 45 1 Andy 22 168 55对key列元素取交集的行为则由how参数控制,默认值为inner, 表示取交集,共有4种取值,用法如下 # 默认值,取key对应的交集 >>> a.merge(b, how='inner') name age height weight 0 Rose 21 172 45 1 Andy 22 168 55 # outer表示取key的并集 # 没有的元素用NaN填充 >>> a.merge(b, how='outer') name age height weight 0 Rose 21.0 172.0 45.0 1 Andy 22.0 168.0 55.0 2 July 18.0 NaN NaN 3 Jack NaN 175.0 75.0 # left表示只取第一个数据框中的key元素 >>> a.merge(b, how='left') name age height weight 0 Rose 21 172.0 45.0 1 Andy 22 168.0 55.0 2 July 18 NaN NaN # right表示,只取第二个数据框中的key元素 >>> a.merge(b, how='right') name age height weight 0 Rose 21.0 172 45 1 Andy 22.0 168 55 2 Jack NaN 175 75当两个数据框中没有overlap的标签名时,用on参数指定key就不行了,此时可以用left_on和right_on分别指定两个数据框中的key列,用法如下 >>> a = pd.DataFrame({'student_name':['Rose', 'Andy', 'July'],'age':[21,22,18]}) >>> a student_name age 0 Rose 21 1 Andy 22 2 July 18 >>> b = pd.DataFrame({'name':['Rose', 'Andy', 'Jack'],'height':[172,168,175],'weight':[45,55,75]}) >>> b name height weight 0 Rose 172 45 1 Andy 168 55 2 Jack 175 75 >>> a.merge(b, left_on='student_name', right_on='name') student_name age name height weight 0 Rose 21 Rose 172 45 1 Andy 22 Andy 168 55当两个数据框除了key之外,还有相同的标签,默认会添加_x, _y后缀加以区分,通过suffixes参数可以自定义后缀,用法如下 >>> a.merge(b, on = 'name') name age height_x height_y weight 0 Rose 21 172 172 45 1 Andy 22 168 168 55 >>> a.merge(b, on = 'name', suffixes = ['_a', '_b']) name age height_a height_b weight 0 Rose 21 172 172 45 1 Andy 22 168 168 55默认都是将列标签作为key,通过指定left_index和right_index的值,可以将行标签作为key,用法如下 >>> a = pd.DataFrame({'name':['Rose', 'Andy', 'July'],'age':[21,22,18], 'height':[172,168,175]}) >>> a name age height 0 Rose 21 172 1 Andy 22 168 2 July 18 175 >>> b = pd.DataFrame({'name':['Rose', 'Andy', 'Jack'],'height':[172,168,175],'weight':[45,55,75]}) >>> b name height weight 0 Rose 172 45 1 Andy 168 55 2 Jack 175 75 >>> a.merge(b, left_index = True, right_index = True) name_x age height_x name_y height_y weight 0 Rose 21 172 Rose 172 45 1 Andy 22 168 Andy 168 55 2 July 18 175 Jack 175 753. join join的合并方式和merge相同, 默认根据行标签进行合并, 优势在于可以一次处理多个数据框,用法如下 >>> a = pd.DataFrame(np.random.randn(2,2),columns=['A','B']) >>> a A B 0 0.639820 1.680362 1 0.212621 1.204541 >>> b = pd.DataFrame(np.random.randn(3,3),columns=['A','B','C']) >>> b A B C 0 0.141238 -1.138415 0.769548 1 1.036439 -1.267921 -0.665270 2 -1.061909 -0.135067 -0.710007 >>> a.join(b, lsuffix='_a', rsuffix='_b') A_a B_a A_b B_b C 0 0.639820 1.680362 0.141238 -1.138415 0.769548 1 0.212621 1.204541 1.036439 -1.267921 -0.665270当两个数据框存在相同的列标签时,需要指定lsuffix和rsuffix参数,为相同的列标签加后缀进行区分。同样的,也有how参数控制合并的行为,在join函数中,how参数的默认值为left, 示例如下 >>> a.join(b, lsuffix='_a', rsuffix='_b') A_a B_a A_b B_b C 0 0.639820 1.680362 0.141238 -1.138415 0.769548 1 0.212621 1.204541 1.036439 -1.267921 -0.665270 # 默认值为left, 以第一个数据框的行作为输出行 >>> a.join(b, lsuffix='_a', rsuffix='_b',how='left') A_a B_a A_b B_b C 0 0.639820 1.680362 0.141238 -1.138415 0.769548 1 0.212621 1.204541 1.036439 -1.267921 -0.665270 # right, 表示以第二个数据框的行作为输出行 >>> a.join(b, lsuffix='_a', rsuffix='_b',how='right') A_a B_a A_b B_b C 0 0.639820 1.680362 0.141238 -1.138415 0.769548 1 0.212621 1.204541 1.036439 -1.267921 -0.665270 2 NaN NaN -1.061909 -0.135067 -0.710007 # inner,表示以二者的交集作为输出行 >>> a.join(b, lsuffix='_a', rsuffix='_b',how='inner') A_a B_a A_b B_b C 0 0.639820 1.680362 0.141238 -1.138415 0.769548 1 0.212621 1.204541 1.036439 -1.267921 -0.665270 # outer, 表示以二者的并集作为输出行 >>> a.join(b, lsuffix='_a', rsuffix='_b',how='outer') A_a B_a A_b B_b C 0 0.639820 1.680362 0.141238 -1.138415 0.769548 1 0.212621 1.204541 1.036439 -1.267921 -0.665270 2 NaN NaN -1.061909 -0.135067 -0.7100074. append append将两个数据框以行的方式进行合并,要求列数相同,用法如下 # append 函数,将新的数据框追加为行 >>> a = pd.DataFrame(np.random.rand(2, 2), columns=['A', 'B']) >>> b = pd.DataFrame(np.random.rand(2, 2), columns=['A', 'B']) >>> a A B 0 0.529614 0.712904 1 0.969706 0.943299 >>> b A B 0 0.626073 0.293426 1 0.952565 0.251707 >>> a.append(b) A B 0 0.529614 0.712904 1 0.969706 0.943299 0 0.626073 0.293426 1 0.952565 0.2517075. assign assign用于给数据框新增列,用法如下 # assign 函数,为数据框新增列 >>> a.assign(C=pd.Series([1,2])) A B C 0 0.529614 0.712904 1 1 0.969706 0.943299 2 # 多列就是多个关键词参数 >>> a.assign(C=pd.Series([1,2]),D=[1,2]) A B C D 0 0.529614 0.712904 1 1 1 0.969706 0.943299 2 2concat, join,merge这3种方式可以合并不同shape的数据框,更加灵活强大,append和assign函数更具针对性。 ·end· —如果喜欢,快分享给你的朋友们吧— 原创不易,欢迎收藏,点赞,转发!生信知识浩瀚如海,在生信学习的道路上,让我们一起并肩作战! 本公众号深耕耘生信领域多年,具有丰富的数据分析经验,致力于提供真正有价值的数据分析服务,擅长个性化分析,欢迎有需要的老师和同学前来咨询。 更多精彩 KEGG数据库,除了pathway你还知道哪些 全网最完整的circos中文教程 DNA甲基化数据分析专题 突变检测数据分析专题 mRNA数据分析专题 lncRNA数据分析专题 circRNA数据分析专题 miRNA数据分析专题 单细胞转录组数据分析专题 chip_seq数据分析专题 Hi-C数据分析专题 HLA数据分析专题 TCGA肿瘤数据分析专题 基因组组装数据分析专题 CNV数据分析专题 GWAS数据分析专题 2018年推文合集 2019年推文合集 写在最后 转发本文至朋友圈,后台私信截图即可加入生信交流群,和小伙伴一起学习交流。 扫描下方二维码,关注我们,解锁更多精彩内容! 一个只分享干货的 生信公众号 |
CopyRight 2018-2019 实验室设备网 版权所有 |