python學習筆記(一) 數據合併

在python中,我們通常會遇到對矩陣或者數據框進行合併,這裏我總結了一些numpy庫和pandas庫中合併數據的方法。

numpy中的數據合併

  • 基礎知識介紹

     在介紹數據合併之前,先說明一下numpy中數組維數的一些需要注意的點:

  1. 數組[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. 三維數組的理解
    對於數組[[[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

以上就是目前我學習到的數據合併的全部內容,隨着學習深入,我會慢慢再來補充的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章