在python中,我們通常會遇到對矩陣或者數據框進行合併,這裏我總結了一些numpy庫和pandas庫中合併數據的方法。
numpy中的數據合併
- 基礎知識介紹
在介紹數據合併之前,先說明一下numpy中數組維數的一些需要注意的點:
- 數組[1,2,3,4]和數組[[1,2,3,4]]這兩種是不一樣的!前者是一維數組,它的shape是(4,);而後者是二維數組(通常我們可以當作矩陣),它的shape是(1,4),對應着矩陣1行四列。當然,兩者之間是可以相互轉化的,轉化代碼如下:
import numpy as np
a=np.array([1,2,3,4])
b=np.array([[1,2,3,4]])
A=a[np.newaxis,:] ##np.newaxis根據在行或列的方向上添加維度
B=b.ravel() ##ravel()函數可以將多維數組拉平稱爲一維數組
- 三維數組的理解
對於數組[[[1,2]],[3,4]]] ,它的shape是(2,1,2)。第一個維度代表:去掉最外層的括號後,裏面共有矩陣的數目,也就是[[1,2]],[[3,4]]這兩個矩陣;而第二、三維度對應着1行2列的矩陣維數
- 數據合併
首先,利用隨機數創建兩個隨機數組,爲了保證每次結果一樣,並設置隨機種子
import numpy as np
np.random.seed(4869) #設置隨機種子
a=np.floor(10*np.random.random((2,3))) ##生成二行三列隨機數(0~1之間)矩陣並向下取整
b=np.floor(np.random.normal(0,1,6)).reshape(2,3) ##生成標準正態分佈的隨機數矩陣
print('矩陣a:\n{}'.format(a))
print('-'*10)
print('矩陣b:\n{}'.format(b))
--------------輸出結果如下----------------
矩陣a:
[[5. 7. 0.]
[2. 3. 8.]]
----------
矩陣b:
[[-2. -3. -3.]
[-2. 1. 1.]]
以下將介紹三種合併方法:
#方法一 stack函數
A=np.stack((a,b),axis=0) #axis控制橫/縱向合併
B=np.stack((a,b),axis=1)
print('縱向合併:\n{}'.format(A))
print('數組A的維度:{}'.format(A.shape))
print('-'*10)
print('橫向合併:\n{}'.format(B))
print('數組B的維度:{}'.format(B.shape))
-------------輸出結果如下---------------
縱向合併:
[[[ 5. 7. 0.]
[ 2. 3. 8.]]
[[-2. -3. -3.]
[-2. 1. 1.]]]
數組A的維度:(2, 2, 3) ##直接在a矩陣的尾部新增矩陣b,組合成一個三維數組
----------
橫向合併:
[[[ 5. 7. 0.]
[-2. -3. -3.]]
[[ 2. 3. 8.]
[-2. 1. 1.]]]
數組B的維度:(2, 2, 3) ##將原a,b矩陣對應行進行組合,組合一個三維數組
從上述結果來看,最終輸出的是一個三維數組。如果我們僅僅是希望將兩個矩陣進行橫\縱向合併後還是矩陣,可以使用以下兩個方法:
#方法二 vstack和hstack函數 (v和h分別代表vertical和horizontal)
A=np.vstack((a,b))
B=np.hstack((a,b))
print('縱向合併:\n{}'.format(A))
print('矩陣A的維度:{}'.format(A.shape))
print('-'*10)
print('橫向合併:\n{}'.format(B))
print('矩陣B的維度:{}'.format(B.shape))
-------------輸出結果如下-----------
縱向合併:
[[ 5. 7. 0.]
[ 2. 3. 8.]
[-2. -3. -3.]
[-2. 1. 1.]]
矩陣A的維度:(4, 3)
----------
橫向合併:
[[ 5. 7. 0. -2. -3. -3.]
[ 2. 3. 8. -2. 1. 1.]]
矩陣B的維度:(2, 6)
#方法三 concatenate函數
A=np.concatenate((a,b),axis=0)
B=np.concatenate((a,b),axis=1)
print('縱向合併:\n{}'.format(A))
print('矩陣A的維度:{}'.format(A.shape))
print('-'*10)
print('橫向合併:\n{}'.format(B))
print('矩陣B的維度:{}'.format(B.shape))
------------輸出結果------------------
縱向合併:
[[ 5. 7. 0.]
[ 2. 3. 8.]
[-2. -3. -3.]
[-2. 1. 1.]]
矩陣A的維度:(4, 3)
----------
橫向合併:
[[ 5. 7. 0. -2. -3. -3.]
[ 2. 3. 8. -2. 1. 1.]]
矩陣B的維度:(2, 6)
#總結:方法二和方法三的效果是一樣的。方法二的vstack對應着方法三的axis=0,hstack對應着axis=1
pandas中的數據合併
pandas中數據合併的方法有很多,例如concat,join,merge,append等函數,這裏主要介紹常用的concat函數和append函數。
#1.創建兩個數據集data1,data2
import pandas as pd
import numpy as np
np.random.seed(4869)
data1=pd.DataFrame(np.arange(6).reshape(2,3),columns=['A','B','C'])
data2=pd.DataFrame(np.ceil(10*np.random.random((2,3))),columns=['A','B','C']) ##向上取整
print('數據集data1:\n{}'.format(data1))
print('-'*10)
print('數據集data2:\n{}'.format(data2))
-----------輸出結果如下----------------
數據集data1:
A B C
0 0 1 2
1 3 4 5
----------
數據集data2:
A B C
0 6.0 8.0 1.0
1 3.0 4.0 9.0
#2.concat函數
data_v=pd.concat([data1,data2],axis=0)
data_h=pd.concat([data1,data2],axis=1)
print('縱向合併:\n{}'.format(data_v)) ##注意:縱向合併的時候需要保持兩個數據集的列名相同
print('-'*10)
print('橫向合併:\n{}'.format(data_h))
----------輸出結果如下---------------
縱向合併:
A B C
0 0.0 1.0 2.0
1 3.0 4.0 5.0
0 6.0 8.0 1.0
1 3.0 4.0 9.0
----------
橫向合併:
A B C A B C
0 0 1 2 6.0 8.0 1.0
1 3 4 5 3.0 4.0 9.0
#!縱向合併的時候,前面的索引是保留了原數據集的索引.如果想讓其重新排列,可設置ignore_index=True
data_v=pd.concat([data1,data2],axis=0,ignore_index=True)
print('縱向合併:\n{}'.format(data_v))
-----------輸出結果如下-------------
縱向合併:
A B C
0 0.0 1.0 2.0
1 3.0 4.0 5.0
2 6.0 8.0 1.0
3 3.0 4.0 9.0
#3.append函數(類似列表中的添加功能,直接在數據框的下方進行添加)
df=data2.append(data1,ignore_index=True)
print('append縱向合併:\n{}'.format(df))
-----------輸出結果如下----------------
append縱向合併:
A B C
0 6.0 8.0 1.0
1 3.0 4.0 9.0
2 0.0 1.0 2.0
3 3.0 4.0 5.0
以上就是目前我學習到的數據合併的全部內容,隨着學習深入,我會慢慢再來補充的。