concat/merge/join

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)