pandas concat & merge 用法
merge 方法
pandas.merge 根据一个或多个键将不同的DataFrame 的行连起来(跟SQL 的连接类似)。
官方文档:pandas.DataFrame.merge
先看例子:
df1 = pd.DataFrame({'key':['b','b','a','c','a','a','b'],'data1':range(7)})
df2 = pd.DataFrame({'key':['a','b','d'],'data1':range(3)})
df1
data1 key
0 0 b
1 1 b
2 2 a
3 3 c
4 4 a
5 5 a
df2
data1 key
0 0 a
1 1 b
2 2 d
pd.merge(df1,df2,on='key')
data1_x key data1_y
0 0 b 1
1 1 b 1
2 6 b 1
3 2 a 0
4 4 a 0
5 5 a 0
当两个Dataframe
有重复的列时,可以通过on 来指定公共列,也可不指定。建议指定。这merge
默认是inner
连接,其效果是,不是两个Dataframe
共有的,则会被省略(即取交集)其他连接方式还有:left、right、outer
再看列名不同的时候,通过left_on
和 right_on
指定列名的例子:
df3= pd.DataFrame({'lkey':['b','b','a','c','a','a','b'],'data1':range(7)})
df4 = pd.DataFrame({'rkey':['a','b','d'],'data1':range(3)})
pd.merge(df3,df4,left_on='lkey',right_on='rkey')
data1_x lkey data1_y 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
全连接outer
示例:
pd.merge(df1,df2,on='key',how = 'outer')
#不共有的行被赋值NaN
data1_x key data1_y
0 0.0 b 1.0
1 1.0 b 1.0
2 6.0 b 1.0
3 2.0 a 0.0
4 4.0 a 0.0
5 5.0 a 0.0
6 3.0 c NaN
7 NaN d 2.0
merge
的 suffixies
参数可以指定附加到两个Dataframe
对象重叠列名上的字符串。
pd.merge(df1,df2,on='key',how = 'outer',suffixes=('_left_','_right'))
data1_left_ key data1_right
0 0.0 b 1.0
1 1.0 b 1.0
2 6.0 b 1.0
3 2.0 a 0.0
4 4.0 a 0.0
5 5.0 a 0.0
6 3.0 c NaN
7 NaN d 2.0
left_index和right_index
用来标识索引是否作为连接键。在索引需要作为连接键的时候,必须
要作相应的标识,否则会报错。
left1= pd.DataFrame({'key':['a','b','a','a','b','c'],'data1':range(6)})
right1 = pd.DataFrame({'group_val':[3.5,7]},index = ['a','b'])
pd.merge(left1,right1,left_on='key',right_index=True)
data1 key group_val
0 0 a 3.5
2 2 a 3.5
3 3 a 3.5
1 1 b 7.0
4 4 b 7.0
当出现按索引合并的情形时,Dataframe
的 join
方法能更加方便的实现。
concat
pandas.concat 实现沿着某条轴将多个对象堆叠。也叫作轴向连接。
官方文档:pandas.concat
例子:
三个没有重叠索引的Series,concat
可以连接在一起形成新的Series
,默认按照axis
= 0
执行。传入axis = 1,
结果变成DataFrame.
s1 = pd.Series([0,1],index=['a','b'])
s2 = pd.Series([2,3,4],index=['c','d','e'])
s3= pd.Series([5,6],index=['f','g'])
pd.concat([s1,s2,s3])
a 0
b 1
c 2
d 3
e 4
f 5
g 6
dtype: int64
pd.concat([s1,s2,s3],axis =1 )
0 1 2
a 0.0 NaN NaN
b 1.0 NaN NaN
c NaN 2.0 NaN
d NaN 3.0 NaN
e NaN 4.0 NaN
f NaN NaN 5.0
g NaN NaN 6.0
join = 'inner '
可以获得交接的拼接。
s4 = pd.concat([s1 * 5,s3])
s4
a 0
b 5
f 5
g 6
dtype: int64
pd.concat([s1,s4],axis=1,join='inner')
0 1
a 0 0
b 1 5
#join='inner'对axis=0 不起作用。
同样的逻辑对DataFrame一样:
import numpy as np
df1 = pd.DataFrame(np.arange(6).reshape(3,2),index=['a','b','c'],columns=['one','two'])
df2 = pd.DataFrame(5+np.arange(4).reshape(2,2),index=['a','c'],columns=['three','four'])
pd.concat([df1,df2],axis=1,keys=['level1','level2'])
level1 level2
one two three four
a 0 1 5.0 6.0
b 2 3 NaN NaN
c 4 5 7.0 8.0