numpy的级联
#concatenate((n1,n2),axis),axis指级联方向默认为0,列方向级联,1位行方向级联
n1 = np.random.randint(0,10, size=(3,3))
n2 = np.random.randint(10,20, size=(3,3))
np.concatenate((n1,n2), axis=1)
out:array([[ 9, 8, 0, 15, 19, 15],
[ 1, 8, 5, 16, 17, 12],
[ 7, 0, 9, 12, 12, 10]])
#hstack()函数行方向级联,vstack()列方向级联
pandas的级联
pandas使用pd.concat函数,与np.concatenate函数类似,只是多了一些参数:
objs 要级联的DataFrame
axis=0
join='outer'
join_axes=None
ignore_index=False
keys = [value1,value2...]
-
简单级联
pd.concat((df1,df2)) # axis可以改变级联方向,ignore_index能重新改变索引下标,keys可以多层索引,将[value1,value2...]变成index最外层索引
不匹配级联
当要级联的行索引或者列索引不一致的时候会用NaN代替
df1 = make_df(list('1234'), list('ABCD'))
df2 = make_df(list('3456'), list('CDEF'))
display(df1,df2)
out:
A B C D
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
4 A4 B4 C4 D4
C D E F
3 C3 D3 E3 F3
4 C4 D4 E4 F4
5 C5 D5 E5 F5
6 C6 D6 E6 F6
pd.concat((df1,df2), sort=True)#这是外级联
A B C D E F
1 A1 B1 C1 D1 NaN NaN
2 A2 B2 C2 D2 NaN NaN
3 A3 B3 C3 D3 NaN NaN
4 A4 B4 C4 D4 NaN NaN
3 NaN NaN C3 D3 E3 F3
4 NaN NaN C4 D4 E4 F4
5 NaN NaN C5 D5 E5 F5
6 NaN NaN C6 D6 E6 F6
pd.concat((df1,df2), join='inner')#内级联
C D
1 C1 D1
2 C2 D2
3 C3 D3
4 C4 D4
3 C3 D3
4 C4 D4
5 C5 D5
6 C6 D6
pd.concat((df1,df2), join_axes=[df2.columns])#以某一个df为准进列索引内级联,并保留df
C D E F
1 C1 D1 NaN NaN
2 C2 D2 NaN NaN
3 C3 D3 NaN NaN
4 C4 D4 NaN NaN
3 C3 D3 E3 F3
4 C4 D4 E4 F4
5 C5 D5 E5 F5
6 C6 D6 E6 F6
- append()级联
df1.append(df2, sort=True)
out:
A B C D E F
1 A1 B1 C1 D1 NaN NaN
2 A2 B2 C2 D2 NaN NaN
3 A3 B3 C3 D3 NaN NaN
4 A4 B4 C4 D4 NaN NaN
3 NaN NaN C3 D3 E3 F3
4 NaN NaN C4 D4 E4 F4
5 NaN NaN C5 D5 E5 F5
6 NaN NaN C6 D6 E6 F6
-
pd.merge()合并
merge与concat的区别在于,merge需要依据某一共同的行或列来进行合并使用pd.merge()合并时,会自动根据两者相同column名称的那一列,作为key来进行合并。
注意每一列元素的顺序不要求一致
一对一
df1 = DataFrame({'name':['张三','李四','Chales'],'id':[1,2,3],'age':[22,21,25]})
df2 = DataFrame({'sex':['男','男','女'],'id':[2,3,4],'group':['sale','search','service']})
out:
name id age
0 张三 1 22
1 李四 2 21
2 Chales 3 25
sex id group
0 男 2 sale
1 男 3 search
2 女 4 service
pd.merge(df1, df2)#默认内级联
name id age sex group
0 李四 2 21 男 sale
1 Chales 3 25 男 search
- 多对一
df1 = DataFrame({'name':['张三','李四','Chales'],'id':[1,2,2],'age':[22,21,25]})
df2 = DataFrame({'sex':['男','男','女'],'id':[2,3,4],'group':['sale','search','service']})
out:
name id age
0 张三 1 22
1 李四 2 21
2 Chales 2 25
sex id group
0 男 2 sale
1 男 3 search
2 女 4 service
df1.merge(df2)
out:
name id age sex group
0 李四 2 21 男 sale
1 Chales 2 25 男 sale
- 多对多
df1 = DataFrame({'name':['张三','李四','张三'],'salary':[10000,12000,20000],'age':[22,21,25]})
df2 = DataFrame({'sex':['男','男','女'],'name':['张三','张三','凡凡'],'group':['sale','search','service']})
out:
name salary age
0 张三 10000 22
1 李四 12000 21
2 张三 20000 25
sex name group
0 男 张三 sale
1 男 张三 search
2 女 凡凡 service
pd.merge(df1, df2)
out:
name salary age sex group
0 张三 10000 22 男 sale
1 张三 10000 22 男 search
2 张三 20000 25 男 sale
3 张三 20000 25 男 search
- 如果有多相同的列索引可以用on指定用什么合并
- 用left_on与right_on可以指定两个df分别用什么列索引合并
- 用left_index与right_index可以根据用index合并