pandas中的数据连接和合并方法 您所在的位置:网站首页 pandas的merge和concat pandas中的数据连接和合并方法

pandas中的数据连接和合并方法

2024-06-05 15:15| 来源: 网络整理| 查看: 265

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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有