一、数据库风格的合并
df1=pd.DataFrame({'key':['b','b','a','c','a','a','b'],'data1':range(7)})
print(df1)
df2=pd.DataFrame({'key':['a','b','d'],'data2':range(3)})
print(df2)
print(pd.merge(df1,df2))#数据合并
key data1
0 b 0
1 b 1
2 a 2
3 c 3
4 a 4
5 a 5
6 b 6
key data2
0 a 0
1 b 1
2 d 2
key data1 data2
0 b 0 1
1 b 1 1
2 b 6 1
3 a 2 0
4 a 4 0
5 a 5 0
1.当没有指明用哪一列进行连接时,程序将自动按重叠列的列名进行连接,上述语句就是按重叠列“key”列进行连接。也可以通过on来指定连接列进行连接。
print(pd.merge(df1,df2,on='key'))
key data1 data2
0 b 0 1
1 b 1 1
2 b 6 1
3 a 2 0
4 a 4 0
5 a 5 0
2.当两个对象的列名不同时,即两个对象没有共同列时,也可以分别进行指定。
df3=pd.DataFrame({'key1':['b','b','a','c','a','a','b'],'data1':range(7)})
df4=pd.DataFrame({'key2':['a','b','d'],'data2':range(3)})
print(pd.merge(df3,df4,left_on='key1',right_on='key2'))
key1 data1 key2 data2
0 b 0 b 1
1 b 1 b 1
2 b 6 b 1
3 a 2 a 0
4 a 4 a 0
5 a 5 a 0
3.通过上面的语句得到的结果里面只有a和b对应的数据,c和d以及与之相关的数据被消去,这是因为默认情况下,merge做的是‘inner’连接,即sql中的内连接,取得两个对象的交集。也有其他方式连接:left、right、outer。用“how”来指明。
df1=pd.DataFrame({'key':['b','b','a','c','a','a','b'],'data1':range(7)})
df2=pd.DataFrame({'key':['a','b','d'],'data2':range(3)})
print(pd.merge(df1,df2,how='left'))
key data1 data2
0 b 0 1.0
1 b 1 1.0
2 a 2 0.0
3 c 3 NaN
4 a 4 0.0
5 a 5 0.0
6 b 6 1.0
4.也可以根据多个键(列)进行合并,用on传入一个由列名组成的列表即可。
left=pd.DataFrame({'key1':['foo','foo','bar'],'key2':['one','two','three'],'lval':[1,2,3]})
right=pd.DataFrame({'key1':['foo','foo','bar','bar'],'key2':['one','one','one','two'],'ravl':[4,5,6,7]})
print(pd.merge(left,right,on=['key1','key2'],how='outer'))
key1 key2 lval ravl
0 foo one 1.0 4.0
1 foo one 1.0 5.0
2 foo two 2.0 NaN
3 bar three 3.0 NaN
4 bar one NaN 6.0
5 bar two NaN 7.0
二、索引上的合并
1.普通索引的合并
Left_index表示将左侧的行索引引用做其连接键,right_index表示将右侧的行索引引用做其连接键
上面两个用于DataFrame中的连接键位于其索引中,可以使用Left_index=True或right_index=True或两个同时使用来进行键的连接。
left1=pd.DataFrame({'key':['a','b','a','a','b','c'],'data1':range(6)})
print(left1)
right1=pd.DataFrame({'group_val':[3.5,7]},index=['a','b'])
print(right1)
print(pd.merge(left1,right1,left_on='key',right_index=True))
key data1
0 a 0
1 b 1
2 a 2
3 a 3
4 b 4
5 c 5
group_val
a 3.5
b 7.0
key data1 group_val
0 a 0 3.5
2 a 2 3.5
3 a 3 3.5
1 b 1 7.0
4 b 4 7.0
2.层次化索引
与数据库中用on来根据多个键合并一样。
三、轴向连接(合并)
轴向连接,默认是在轴方向进行连接,也可以通过axis=1使其进行横向连接。
1.对于numpy对象(数组)可以用numpy中的concatenation函数进行合并。
arr=np.arange(12).reshape(3,4)
print(arr)
print(np.concatenate([arr,arr]))#纵向连接
print(np.concatenate([arr,arr],axis=1))#横向连接
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[ 0 1 2 3 0 1 2 3]
[ 4 5 6 7 4 5 6 7]
[ 8 9 10 11 8 9 10 11]]
2.对于pandas对象(如Series和DataFrame),可以pandas中的concat函数进行合并。
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'])
print(pd.concat([s1,s2,s3]))
a 0
b 1
c 2
d 3
e 4
f 5
g 6
dtype: int64
四、合并重叠数据
1.对于索引全部或部分重叠的两个数据集,我们可以使用numpy的where函数来进行合并,where函数相当于if—else函数。
a=pd.Series([1,2.5,3,3.5,4.5,5],index=['f','e','d','c','b','a'])
b=pd.Series([2,2.5,3,3.5,4,5],index=['f','e','d','c','b','a'])
print(np.where(pd.isnull(a),b,a))
[1. 2.5 3. 3.5 4.5 5. ]
2.对于重复的数据显示出相同的数据,而对于不同的数据显示a列表的数据。同时也可以使用combine_first的方法进行合并。合并原则与where函数一致,遇到相同的数据显示相同数据,遇到不同的显示a列表数据。
a=pd.Series([1,2.5,3,3.5,4.5,5],index=['f','e','d','c','b','a'])
b=pd.Series([2,2.5,3,3.5,4,5],index=['f','e','d','c','b','a'])
#print(np.where(pd.isnull(a),b,a))
print(a.combine_first(b))
f 1.0
e 2.5
d 3.0
c 3.5
b 4.5
a 5.0
dtype: float64
总结:
1.使用pd.merge(df1,df2)进行数据合并,重叠索引用on来指定连接列进行连接。当两个对象没有共同列时,用left_on、right_on分别进行制定。
2.默认情况下,merge做的是‘inner’连接,即sql中的内连接,取得两个对象的交集。
3.numpy中,可以用concatenation函数进行合并。
pandas中,可以用concat函数进行合并。
3.对于索引全部或部分重叠的两个数据集,我们可以使用numpy的where函数或combine_first()函数来进行合并