合并
之前提到添加数据只能添加列,如果要添加行就需要使用合并功能。
concat
concat在python中主要用于添加行,即纵向合并。
import pandas as pd
import numpy as np
df1=pd.DataFrame(np.arange(1,13).reshape(3,4),columns=['a','b','c','d'])
df2=pd.DataFrame(np.arange(1,13).reshape(3,4),columns=['b','c','d','e'])
res=pd.concat([df1,df2],axis=0,ignore_index=True,join='inner')
#默认为outer(并集),inner为交集,ignore_index表示合并后是(1)否(0)要重新排index
print(res)
b c d
0 2 3 4
1 6 7 8
2 10 11 12
3 1 2 3
4 5 6 7
5 9 10 11
请按任意键继续. . .
在concat函数中,第一个参数表示要合并的数据,注意要用中括号括起来;axis表示合并方向,axis=0表示纵向合并(一般都是纵向);ignore_index表示合并后的index是否重新排序,True代表重新排序;join表示合并方式,有参数outer、inner,inner表示取交集,outer表示取并集。
merge
如果想要实现类似SQL中的连接功能,应使用merge函数。
import pandas as pd
left=pd.DataFrame({'key':['k0','k1','k2','k3'],
'A':['A0','A1','A2','A3'],
'B':['B0','B1','B2','B3']})
right=pd.DataFrame({'key':['k0','k1','k2','k3'],
'C':['C0','C1','C2','C3'],
'D':['D0','D1','D2','D3']})
print(left,right,sep='\n')
res=pd.merge(left,right,on='key')#如果有多个key,可以写:on=['key1','key2']
print(res)
key A B
0 k0 A0 B0
1 k1 A1 B1
2 k2 A2 B2
3 k3 A3 B3
key C D
0 k0 C0 D0
1 k1 C1 D1
2 k2 C2 D2
3 k3 C3 D3
key A B C D
0 k0 A0 B0 C0 D0
1 k1 A1 B1 C1 D1
2 k2 A2 B2 C2 D2
3 k3 A3 B3 C3 D3
请按任意键继续. . .
当你不输入how参数时,默认是inner(内连接),除此之外还有left(左连接)、right(右连接)、outer(全连接)。
在这里,输入key参数是两个数据中都有相同的列,如果你想让数据A中的c和数据B中的d分别作为连接键,应该如下做:
import pandas as pd
left=pd.DataFrame({'key1':['k0','k1','k2','k3'],
'A':['A0','A1','A2','A3'],
'B':['B0','B1','B2','B3']})
right=pd.DataFrame({'key2':['k0','k1','k2','k3'],
'C':['C0','C1','C2','C3'],
'D':['D0','D1','D2','D3']})
print(left,right,sep='\n')
res=pd.merge(left,right,left_on='key1',right_on='key2')
print(res)
key1 A B
0 k0 A0 B0
1 k1 A1 B1
2 k2 A2 B2
3 k3 A3 B3
key2 C D
0 k0 C0 D0
1 k1 C1 D1
2 k2 C2 D2
3 k3 C3 D3
key1 A B key2 C D
0 k0 A0 B0 k0 C0 D0
1 k1 A1 B1 k1 C1 D1
2 k2 A2 B2 k2 C2 D2
3 k3 A3 B3 k3 C3 D3
请按任意键继续. . .
此种情况需要分别指定left_key和right_key是什么。
除此之外,如果你想要让index作为键,可以这样做:
import pandas as pd
import numpy as np
left=pd.DataFrame({'key1':['k0','k1','k2','k3'],
'A':['A0','A1','A2','A3'],
'B':['B0','B1','B2','B3']})
right=pd.DataFrame({'key2':['k0','k1','k2','k3'],
'C':['C0','C1','C2','C3'],
'D':['D0','D1','D2','D3']})
print(left,right,sep='\n')
res=pd.merge(left,right,left_index=True,right_index=True)
print(res)
让left_index和right_index均为True即可。
如果两个数据有相同的列名但意思并不相同,合并后应做一些标识以便区分两者,可以这样做:
import pandas as pd
import numpy as np
boys=pd.DataFrame({'k':['k0','k1','k2'],'age':[1,3,3]})
girls=pd.DataFrame({'k':['k0','k1','k2'],'age':[3,2,4]})
res=pd.merge(boys,girls,on='k',suffixes=['_boys','_girls'],how='outer')
#两个age不同,不能合并,这时需要在age后加上一些后缀
print(res)
suffixes可以实现在原列名后方加入一些后缀的功能。