pandas数据合并之append与concat
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])