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)