关于pandas拼接和合并的区别(笔记)
2023-12-15 09:18:26
在数据整合中我们经常需要把多个表合并在一起。pandas模块为我们提供了很强大的合并功能,常用的方法有concat, append, merge, join。此文将分别记录一下四种方法的常用操作,然后对比一下四种方法。
这四种方法的具体用法形式如下:
一、concat
df = pd.concat(objs, axis = 0, ignore_index = False, join = "outer
concat是”contatenate"的缩写,指的是多表之间的“拼接”。其实“拼接”和“合并”还是有区别的,后面我们会说到。事实上,concat方法有很多参数,上例给出的只是常用的。其中:
- objs: 指的是要合并的dataframe(们)。可以是一个列表[df1,df2,...]也可以是一个集合(df1,df2,...)。(我是这么理解的,试了一下列表集合都有效)
- axis:指的是拼接的方向。axis = 0指的是拼接行(向下拼接),axis = 1指的是拼接列(向右拼接)。
- ignore_index: 指的是拼接后是否忽视原df各自的索引。比如,假如我们按行拼接,原来df1中有五条数据,索引是0,1,2,3,4。原来的df2中也有五条数据,索引也是0,1,2,3,4。如果我们在合并时,将ignoreindex的值设为False,那么拼接后df的索引就是0,1,2,3,4,0,1,2,3,4。那么如果将ignore_index的值设为True, 那么拼接后df的索引就是0,1,2,3,4,5,6,7...
- join:表示“如何拼接”。由于两表中的信息可能是不同的,所以要设置这个参数以表明拼接方式。其中,outer表示取并集,inner表示取交集。
二、append
df = df1.append(df2)
append可以视作axis=0的,简便版的concat。也就是说,它只支持行拼接,同时比concat简便一些。
这里要注意和concat的用法区别。concat是pd的属性,所以调用的时候应该是pd.concat((df1,df2)),而append是对df的方法,所以调用的时候是df1.append(df2)
三、merge
df = pd.merge(left, right, how = "inner",on = "None")
与concat(拼接)不同,merge才是真正意义上的”合并“。拼接和合并的区别在于,拼接只是简单地”堆“在一起,而合并则是基于某一个”主键“将两个表”合“在一起。事实上merge也有很多参数,这里只列了最常用的。其中:
- left: 左表。也就是第一个df。
- right:右表。也就是第二个df。
- how: 和concat里面的"join"类似,表示“如何合并两表。除了”inner“和”outer“以外,merge中还有”left"(基于左表进行合并)和“right”(基于右表进行合并)。具体地:1)left: 只使用左表的键。2)right:只使用右表的键。3)inner: 使用左右表键的交集。4)outer:使用左右表键的并集。
- on: 表示按照哪一个键来进行合并。
四、join
df = left.join(right,on = "key", how = "left")
类似于append之于concat,join也可以被理解为merge的一个简便并且特殊的方法。join也可以设置参数"how",只不过这里默认值不同。Merge中,how的默认值是”inner“,join中的默认值为”left"。
五、对比及总结
- concat和append可以实现的是表间”拼接“,而merge和join则实现的是表间”合并“。区别在于是否基于”键“来进行合并。如果只是简单地”堆砌“,则用concat和append比较合适,而如果遇到关联表,需要根据”键“来合并,则用merge和join。
- concat 和 merge是pandas的属性,所以调用的时候应该写成pd.concat()或者pd.merge();而append和join是对DataFrame的方法,所以调用的时候应该写成df.append()或者df.join()。
- append只能实现行拼接,从这个观点来看,concat的功能更加强大。理论上append可以完成的操作concat都可以完成,只需要更改相应的参数即可。
- 类似于append之于concat,join可以完成的操作merge也都可以完成,因此merge更加强大。
- append和join存在的意义在于简洁和易用。
文章来源:https://blog.csdn.net/L_H9130/article/details/132745878
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!