关于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方法有很多参数,上例给出的只是常用的。其中:

  1. objs: 指的是要合并的dataframe(们)。可以是一个列表[df1,df2,...]也可以是一个集合(df1,df2,...)。(我是这么理解的,试了一下列表集合都有效)
  2. axis:指的是拼接的方向。axis = 0指的是拼接行(向下拼接),axis = 1指的是拼接列(向右拼接)。
  3. 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...
  4. 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也有很多参数,这里只列了最常用的。其中:

  1. left: 左表。也就是第一个df。
  2. right:右表。也就是第二个df。
  3. how: 和concat里面的"join"类似,表示“如何合并两表。除了”inner“和”outer“以外,merge中还有”left"(基于左表进行合并)和“right”(基于右表进行合并)。具体地:1)left: 只使用左表的键。2)right:只使用右表的键。3)inner: 使用左右表键的交集。4)outer:使用左右表键的并集。
  4. on: 表示按照哪一个键来进行合并。

四、join

df = left.join(right,on = "key", how = "left")


类似于append之于concat,join也可以被理解为merge的一个简便并且特殊的方法。join也可以设置参数"how",只不过这里默认值不同。Merge中,how的默认值是”inner“,join中的默认值为”left"。


五、对比及总结

  1. concat和append可以实现的是表间”拼接“,而merge和join则实现的是表间”合并“。区别在于是否基于”键“来进行合并。如果只是简单地”堆砌“,则用concat和append比较合适,而如果遇到关联表,需要根据”键“来合并,则用merge和join。
  2. concat 和 merge是pandas的属性,所以调用的时候应该写成pd.concat()或者pd.merge();而append和join是对DataFrame的方法,所以调用的时候应该写成df.append()或者df.join()。
  3. append只能实现行拼接,从这个观点来看,concat的功能更加强大。理论上append可以完成的操作concat都可以完成,只需要更改相应的参数即可。
  4. 类似于append之于concat,join可以完成的操作merge也都可以完成,因此merge更加强大。
  5. append和join存在的意义在于简洁和易用。

文章来源:https://blog.csdn.net/L_H9130/article/details/132745878
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。