美文网首页Python教程
pandas数据合并之append与concat

pandas数据合并之append与concat

作者: 躺在稻田里的小白菜 | 来源:发表于2019-08-25 17:40 被阅读0次

    pandas的数据合并与重塑有很多种方法,包括直接复制列,concat,append,merge和join,本文将重点讨论前面三种最简单而又最常用的方法。merge和join有空再更哈☺。

    一. 直接复制列

    可以将新的数据列利用 [] 直接赋值给原始数据,但是要求新的列名不能和原始数据中的列名重名,否则会覆盖原始数据中的列。
    具体来看:


    可以看到新的数据块被直接贴在了原数据列的后面,是不是很简单,嗯但是这个方法有很多局限性,比如:

    • 只能按列合并,不能按行合并操作。
    • 只能给原数据中存在的index添加新列,不会给原数据添加新行(index)。这种合并方法是以原始数据index为基准的,也就是说,新老数据的交集行会被直接保留,老数据有的而新数据没有的索引行将会补nan值,新数据有的而老数据没有的索引行,将会被舍弃。可以看到,例子中index=3的行就被舍弃了,而index=0的行被设为了nan。

    二. append

    前面已经有了合并列的方法,那么pandas不会这么坑爹,不能合并行吧!!当然不会,append就是干这个事情的,它专门用来在表尾添加新行...
    熟悉Python的大佬们看到append这个词就应该有感觉了,没错,它就是添加新元素的方法。Seris,DataFrame,Index都有这个方法,我们可以利用这个添加新元素的方法,来对数据进行纵向合并。
    官方文档中是这样描述append的用途的“在表尾中添加新行,并且返回添加后的数据对象,如果添加的行中存在原数据中没有的列,那么将给原数据添加一个新列,并用nan补值。”
    DataFrame.append(*other*, *ignore_index=False*, *verify_integrity=False*, *sort=None*)

    • other: 是要添加的数据,append很不挑食,这个other可以是dataframe,dict,Seris,list等等。
    • ignore_index: 参数为True时将在数据合并后,按照0,1,2,3....的顺序重新设置索引,忽略了旧索引。
    • verify_integrity:参数为True时,如果合并的数据与原数据包含索引相同的行,将报错。

    我们来看个栗子:


    三. concat

    concat函数是在pandas命名空间下的方法,所以通过pd.concat()的方式来引用,它可以将数据根据不同的轴作做融合。concat 与其说是连接,更准确的说是拼接。就是把两个表直接合在一起。于是有一个突出的问题,是横向拼接还是纵向拼接。

    pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, copy=True)
    常用参数:
    obj:要合并的series,dataframe或者是panel构成的序列,常将这些数据排成一个列表[data1,data2....]。
    axis:按照哪个方向拼接,0是纵向拼接(默认),1是横向拼接。
    join:设置合并取交集(inner)还是并集(outer)。纵向拼接时取column的交并集,横向拼接时取index的交并集。
    join_axes:index的列表,仅在横向合并时使用,指明要将数据合并入哪个原表的index。
    ignore_index:如果设置为true,则无视表的index,直接合并,合并后生成新的index。
    keys:表标识的列表,用来区分合并的表来自哪里。

    1. 纵向合并

    纵向合并axis=0,是将表在竖直方向拼接起来,此时join参数控制的是column的交集或者并集,使用join_axes会报错。举个栗子....



    我们看到join参数控制着column的交并集。如果取并集,不存在的位置会被补充上nan。
    另外,如果我们设置了ignore_index=True的话,数据合并后将会重新按照0,1,2,3.......的顺序重新构建索引。


    2. 横向合并

    横向合并axis=1,是将表在水平方向拼接起来,此时join参数控制的是index的交集或者并集。
    横向合并时,即便是列名相同,也不会合并成一列,因为此时join控制的是index的交并集。而ignore_index将会重排列名的索引,而不是重排index。



    再来个index并集的栗子.....


    • join_axes参数

    如果有join_axes的参数传入,可以指定根据哪个index来对齐数据 。例如根据df1表对齐数据,就会保留指定的df1表的index,然后将df4的表与之拼接,仅axis=1时有效。是不是有种熟悉的感觉,嗯对,和直接复制列一样.....
    result = pd.concat([df1, df4], axis=1, join_axes=[df1.index])

    join_axes

    相关文章

      网友评论

        本文标题:pandas数据合并之append与concat

        本文链接:https://www.haomeiwen.com/subject/uhaxkftx.html