pandas中,有时候需要对多个Series或DataFrame进行连接拼合,对此pandas中一般有三种方法:merge()、join()、concat()。下面一一进行简单的介绍。
merge()是对DataFrame进行行连接的,对于两个DataFrame,可以用参数on指定用来merge的共同列,也可以利用left_on和right_on分别指定用来merge的列,还可以利用how参数指定merge的方式,how可以为inner、outer、left、right,默认为inner。表示以两者交集方式merge,outer表示并集,left表示以左边的df为准,right表示以右边的df为准;如果指定merge的列元素不是唯一的,是多对多的,则以笛卡尔积的形式merge,保证merge后不遗漏数据;此外,还可以利用left_index和right_index布尔参数进行索引merge,利用sort布尔参数选择是否merge排序等。如下代码示例,df3是df1和df2指定n4以outer并集的方式merge,结果如下,其中merge后之前不存在的数据为NaN。
df1
Out[3]:
n1 n2 n3 n4
one 0 1 2 a
two 3 4 5 b
three 6 7 8 c
df2
Out[4]:
n1 n5 n4
two 9 10 a
four 11 12 b
six 13 14 d
df3=pd.merge(df1,df2,on='n4',how='outer')
df3
Out[6]:
n1_x n2 n3 n4 n1_y n5
0 0.0 1.0 2.0 a 9.0 10.0
1 3.0 4.0 5.0 b 11.0 12.0
2 6.0 7.0 8.0 c NaN NaN
3 NaN NaN NaN d 13.0 14.0
如果是直接根据索引进行合并的话,DataFrame有一个直接的join()方法,默认按索引合并,如下代码示例,由于df1和df2中有重叠的列名,所以还需要分别指定lsuffix和rsuffix参数来表示合并后的列名后缀以区分合并后的列名。当然,这里的how默认的是left,此外也可以利用on参数来指定合并的列,默认为None,但如果指定了列,则这个列一定要在df1中存在,可以不在df2中存在,df2中没有指定列的话,默认为df2的索引进行合并。
join也支持传入一个由dataframe或series组成的列表或者元组,进行多次索引拼接。join单次拼接本质上使用的是merge,如果是多次拼接,那么如果index是unique的话,源码层面使用的是concat,如果不是unique的话,则使用merge进行循环拼接。因此,这里如果有的df有多重索引,有的df是单层索引,merge可以根据level name识别进行拼接,但是concat则会直接将多重索引转为元组组成的单层索引,然后再concat。即如果想要把既有多重索引又有单层索引,而且想让索引根据名称拼接的话,那么不能使用join(因为本质上会使用concat),可以直接使用merge进行循环拼接。
df1.join(df2,lsuffix='_x',rsuffix='_y',how='outer')
Out[9]:
n1_x n2 n3 n4_x n1_y n5 n4_y
four NaN NaN NaN NaN 11.0 12.0 b
one 0.0 1.0 2.0 a NaN NaN NaN
six NaN NaN NaN NaN 13.0 14.0 d
three 6.0 7.0 8.0 c NaN NaN NaN
two 3.0 4.0 5.0 b 9.0 10.0 a
轴向连接,就是直接将多个Series或者DataFrame按某个轴的方向进行连接。这不同于merge和join,轴向连接不是指定某个列进行合并,而是直接将多个对象沿着指定的轴进行堆叠,不管这个轴的索引上多个对象是否有重复值。如下代码示例,先是把df1和df2沿着轴1方向进行合并,得到df4。这里指定了参数keys,表示给df1和df2赋名,会在合并后体现出来;df5是沿着0轴方向合并,结果如下所示,可以看出,concat()实际上就是沿着某个轴进行堆叠。此外concat()还有一个比较重要的参数是join,值可为inner和outer,默认为outer,表示除了指定堆叠的轴外的其他轴上的合并方式,默认为并集。参数的效果可以在df6中体现出来。
In[10]:df4=pd.concat([df1,df2],axis=1,keys=['df1','df2'])
In[11]:df4
Out[11]:
df1 df2
n1 n2 n3 n4 n1 n5 n4
four NaN NaN NaN NaN 11.0 12.0 b
one 0.0 1.0 2.0 a NaN NaN NaN
six NaN NaN NaN NaN 13.0 14.0 d
three 6.0 7.0 8.0 c NaN NaN NaN
two 3.0 4.0 5.0 b 9.0 10.0 a
In[12]:df5=pd.concat([df1,df2],axis=0,keys=['df1','df2'])
In[13]:df5
Out[13]:
n1 n2 n3 n4 n5
df1 one 0 1.0 2.0 a NaN
two 3 4.0 5.0 b NaN
three 6 7.0 8.0 c NaN
df2 two 9 NaN NaN a 10.0
four 11 NaN NaN b 12.0
six 13 NaN NaN d 14.0
In[14]:df6=pd.concat([df1,df2],axis=0,keys=['df1','df2'],join='inner')
In[15]:df6
Out[15]:
n1 n4
df1 one 0 a
two 3 b
three 6 c
df2 two 9 a
four 11 b
six 13 d
以上是对merge、join、concat的简单介绍,可知前两者是指定列或者按索引进行行连接,并可以对指定的列或者索引进行选择合并的方式;后者则是沿着指定的轴进行堆叠,保证了所有对象的这个轴上的所有索引元素都是存在的,但可以指定除了这个指定轴外的其他轴的合并方式。