pandas中的数据连接和合并方法-----merge()、join()、concat()的简单介绍

       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的简单介绍,可知前两者是指定列或者按索引进行行连接,并可以对指定的列或者索引进行选择合并的方式;后者则是沿着指定的轴进行堆叠,保证了所有对象的这个轴上的所有索引元素都是存在的,但可以指定除了这个指定轴外的其他轴的合并方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值