美文网首页
concat/merge/join

concat/merge/join

作者: 酸甜柠檬26 | 来源:发表于2019-08-18 19:18 被阅读0次

    merge:

    merge(left,right,how='inner',on=None,left_on=None,right_on=None,left_index=False,right_index=False,sort=True,suffixes=('_x','_y'),copy=True,indicator=False)
    

    left与right:合并操作时左右两个不同的df
    how:inner(默认)、outer、left、right——相当于SQL中的连接方式
    on:需要连接的列名,必须是在左右两边都有的列名,在on后多个键可以多键连接
    left_on:left中用作连接键的列,此参数在左右两个df中没有相同列名但指定意思相似时可用
    right_on:同left_on
    left_index:使用left的行索引作为它的连接键,这种情况下最好用join
    right_index:同left_index
    sort:通过连接键按字母顺序对合并的数据进行排序,在默认情况下为True,为了更好的性能
    suffixes:当左右两个DataFrame的列名重复时,来指定后缀,默认为'_x''_y'
    copy:如果为False,则在某些特殊情况下避免将数据复制到结果数据结构中,默认为True
    indicator:添加一个特殊的列,指示每一行的来源,值将根据每行中的连接数据的来源分为‘left_only’,'right_only','both'

    join:

    df.join(other,on=None,how='left',lsuffix='',rsuffix='',sort=False)
    

    1、要合并的键的列名相同,内容相似

    df12 = pd.DataFrame({'key':['b','b','a','c','a','b'],'data1':range(6)})
    
       data1 key
    0      0   b
    1      1   b
    2      2   a
    3      3   c
    4      4   a
    5      5   b
    df22 = pd.DataFrame({'key':['a','b','a','b','d'],'data2':range(5)})
    
       data2 key
    0      0   a
    1      1   b
    2      2   a
    3      3   b
    4      4   d
    #merge
    one = pd.merge(df12,df22,how='left')#相当于sql中的左连接
        data1 key  data2
    0       0   b    1.0
    1       0   b    3.0
    2       1   b    1.0
    3       1   b    3.0
    4       2   a    0.0
    5       2   a    2.0
    6       3   c    NaN
    7       4   a    0.0
    8       4   a    2.0
    9       5   b    1.0
    10      5   b    3.0
    

    要想实现one这种连接,用join也可以实现

    four = df12.join(df22.set_index('key'),on='key')
    将df22中的key设置成索引后,可得到one一样的DataFrame

       data1 key  data2
    0      0   b    1.0
    0      0   b    3.0
    1      1   b    1.0
    1      1   b    3.0
    2      2   a    0.0
    2      2   a    2.0
    3      3   c    NaN
    4      4   a    0.0
    4      4   a    2.0
    5      5   b    1.0
    5      5   b    3.0
    

    从上,join最适合的合并是基于行索引index
    通常情况下,能用merge就用merge进行合并。

    1.2 两个dataframe的要合并的键相似,但键名不同

    df3 = pd.DataFrame({'lkey':['b','b','a','c','a','a','b'],'data1':range(7)})
    df4 = pd.DataFrame({'rkey':['a','b','d'],'data2':range(3)})
    #merge
    df3_merge_df4 = pd.merge(df3,df4,left_on='lkey',right_on='rkey')
    
       data1 lkey  data2 rkey
    0      0    b      1    b
    1      1    b      1    b
    2      6    b      1    b
    3      2    a      0    a
    4      4    a      0    a
    5      5    a      0    a
    #join
    df3_join_df4 = df3.join(df4.set_index('rkey'),on='lkey',how='inner')
    
       data1 lkey  data2
    0      0    b      1
    1      1    b      1
    6      6    b      1
    2      2    a      0
    4      4    a      0
    5      5    a      0
    

    concat:

    拼接,默认是沿着axis=0的轴向生效的,即跨行操作(沿着每一行垂直向下)

    data1 = pd.DataFrame(np.arange(6).reshape(2,3),columns=list('abc'))
    data2 = pd.DataFrame(np.arange(20,26).reshape(2,3),columns=list('ayz'))
    #concat,axis=0
    data_concat0 = pd.concat([data1,data2])
    
        a    b    c     y     z
    0   0  1.0  2.0   NaN   NaN
    1   3  4.0  5.0   NaN   NaN
    0  20  NaN  NaN  21.0  22.0
    1  23  NaN  NaN  24.0  25.0
    #merge
    data_merge = pd.merge(data1,data2,on='a',how='outer')
    
        a    b    c     y     z
    0   0  1.0  2.0   NaN   NaN
    1   3  4.0  5.0   NaN   NaN
    2  20  NaN  NaN  21.0  22.0
    3  23  NaN  NaN  24.0  25.0
    

    当axis=1时,按照axis=1的轴向拼接,跨列操作

    #concat,axis=1
    data_concat1 = pd.concat([data1,data2],axis=1)
    
       a  b  c   a   y   z
    0  0  1  2  20  21  22
    1  3  4  5  23  24  25
    #join
    data_join = data1.join(data2,lsuffix='_l')
       a_l  b  c   a   y   z
    0    0  1  2  20  21  22
    1    3  4  5  23  24  25
    

    综上:
    1、concat用于拼接,可拼接多个,区别在axis=0或1
    2、merge类比成sql中的join
    3、两个df合并时,用merge就行,三个及以上的df合并可用join,但前提是要将合并的那个键设置成index。

    df1 = pd.DataFrame({'水果':['香蕉','橘子','苹果','梨子'],'销量1':[11,22,33,44]})
    df2 = pd.DataFrame({'水果':['香蕉','橘子','苹果','梨子'],'销量2':[23,24,25,26]})
    df3 = pd.DataFrame({'水果':['香蕉','橘子','苹果','梨子'],'销量3':[16,17,18,19]})
    
    df1 = df1.set_index('水果')
    df2 = df2.set_index('水果')
    df3 = df3.set_index('水果')
    c = df1.join([df2,df3])
    print(c)
    
    image.png

    相关文章

      网友评论

          本文标题:concat/merge/join

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