在python表格操作过程中常涉及到,表格相互拼接和合并问题。pandas模块为我们提供了很强大的合并功能,常用的方法有concat, append, merge, join。
四种函数具体如下:
一、concat
df=pandas.concat(objs, *, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=False, copy=None)
concat是”contatenate"的缩写,指的是多表之间的“拼接”。该函数能够沿指定轴执行连接操作,同时对其他轴上的索引(如果有的话,Series 只有一个轴)执行可选的集合运算(并集或交集)
其中:
- objs: 指的是要合并的series,dataframe或者是panel构成的序列lsit
- axis: 指的是拼接的方向即合并连接的轴,axis = 0指的是拼接行(向下拼接),axis = 1指的是拼接列(向右拼接)
- join:表示“如何拼接”。由于两表中的信息可能是不同的,所以要设置这个参数以表明拼接方式。其中,outer表示取并集,inner表示取交集。默认是outer
- 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_axes:如果有join_axes的参数传入,可以指定根据那个轴来对齐数据
- keys:前面提到的keys参数可以用来给合并后的表增加key来区分不同的表数据来源
二、append
append是series和dataframe的方法,使用它就是默认沿着列进行拼接,append可以视作axis=0的,简便版的concat。也就是说,它只支持行拼接,同时比concat简便一些。这里要注意和concat的用法区别。concat是pd的属性,所以调用的时候应该是pd.concat((df1,df2)),而append是对DataFrame的方法,所以调用的时候是DataFrame.append(df2)
x=df.append(other, ignore_index=False, verify_integrity=False, sort=None)
参数说明:
- other:要追加的数据,可以是dataframe,series,字典,列表
- ignore_index:两个表的index是否有实际含义,默认为False,若ignore_index=True,表根据列名对齐合并,生成新的index
- verify_integrity:默认为False,若为True,创建具有重复项的索引时引发ValueError
- sort:默认为False,若为True如果’ self ‘和’ other '的列没有对齐,则对列进行排序。
三、merge
merge与concat不同,merge是根据两个表的具体的键来进行匹配合并,而concat是根据轴的具体方向进行合并不会有匹配过程。
df=DataFrame.merge(left,right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=None, indicator=False, validate=None)
参数:
- left: 拼接的左侧DataFrame或命名的Series对象
- right: 拼接的右侧DataFrame对象
- on: 表示按照两个dataframe按某一列来进行合并,该列必须同时出现在两个dataframe中。如果未传递且left_index和right_index为False,则DataFrame中的列的交集将被推断为连接键。
- left_index: 如果为True,则使用左侧DataFrame中的索引(行标签)作为其连接键的列。对于具有MultiIndex(分层)的DataFrame,级别数必须与右侧DataFrame中的连接键数相匹配。
- right_index: 与left_index功能相似。
- how: {‘left’, ‘right’, ‘outer’, ‘inner’,‘cross’}, default ‘inner’ 默认为合并两个frame的交集连接方式。inner使用两个frame中关键点的交集,类似于SQL内连接;left是以左frame中的键为基础,匹配另外的frame中的键,类似于SQL左外连接;right是以右frame中的键为基础,匹配另外的frame中的键,类似于SQL右外连接;outer取其并集,如果其中一个dataframe中的连接键列中不含有某元素,则该元素对应的这行数据中的其它列用NAN填充,类似SQL的full outer join中的全连接;cross创建两个DataFrame的笛卡尔积,默认保留左边的顺序,类似于SQL中的cross join。
- left_on:左侧DataFrame中用作连接键的列。 可以是列名,索引级名称,也可以是长度等于DataFrame长度的数组。
- right_on: 右侧DataFrame中用作连接键的列。可以是列名,索引级名称,也可以是长度等于DataFrame长度的数组。
- sort: 按字典顺序通过连接键对结果DataFrame进行排序。 默认为True,设置为False将在很多情况下显着提高性能。
- suffixes: 用于重叠列的字符串后缀元组。 默认为(‘x’,’ y’)。也可手动指定:suffixes=(“df1”,“df2”)
- indictor:显示字段的来源,表明生成的一条记录是来自哪个DataFrame:both、left_only、right_only
- copy : bool, default True;If False, avoid copy if possible. 默认为True, 总是将数据复制到数据结构中。设为Fasle,尽可能避免复制。
四、join
df=DataFrame.join(obj, on=None, how=’left’, lsuffix=”, rsuffix=”, sort=False,validate="one_to_one")
DataFrame内置的join方法是一种快速合并的方法。它默认以index作为对齐的列,join也可以被理解为merge的一个简便并且特殊的方法。join也可以设置参数"how",只不过这里默认值不同。Merge中,how的默认值是”inner“,join中的默认值为”left"。
- obj:要合并的表,DataFrame、或者带有名字的Series、或者DataFrame的list。如果传递的是Series,那么其name属性应当是一个集合,并且该集合将会作为结果DataFrame的列名
- on:合并表时的列名称,连接的列,默认使用索引连接
- how:{‘left’, ‘right’, ‘outer’, ‘inner’}, 默认left连接方式,即左连接。具体连接方式见上文merge参数how
- lsuffix:列名重复时,合并后左表列名使用的后缀,默认’ ’
- rsuffix:列名重复时,合并后右表列名使用的后缀,默认’ ’
- sort:按照字典顺序对结果在连接键上排序。如果为False,连接键的顺序取决于连接类型(关键字)。True时根据合并的索引排列合并结果,False时根据how参数排序,默认False
- validate:设置合并数据类型,支持"one_to_one" or “1:1”、“one_to_many” or “1:m”、“many_to_one” or “m:1”、“many_to_many” or “m:m”
五、对比
- concat和append是通过轴向的合并,merge和join主要是通过具体的某一列(键)进行匹配(这个过程类似于VLOOKUP),若在合并数据的过程中需要通过某些键进行关联则使用merge和join,若不需要匹配则用concat和append。
- append和join相较于concat和merge来说,参数更少一点,能够实现的功能也相对少一些,可以理解为简化版的concat和merge