閱讀提示
本文將提到Pandas數據合並方法merge()、concat()、combine_first()方法,數據的重塑和矩陣轉置等操作的實現
目錄
一、數據合並
pandas提供了三種主要方法可以用於數據合並:
- pandas.merge() 方法 : 數據庫風格的合並
- pandas.concat() 方法 : 軸向連接,沿着一條軸將多個對象堆疊到一起
- combine_first() 方法 :合並重疊數據
1、pandas.merge() 方法
將兩個DataFrame合並
以列名為連接鍵
df1 = DataFrame({'name':['Carl','Lucy','a','b','c'],'data1': range(5)})
df2 = DataFrame({'name':['Carl','Lucy','x','y','z'],'data2': range(5)})
''' df1 name data1 0 Carl 0 1 Lucy 1 2 a 2 3 b 3 4 c 4 df2 name data2 0 Carl 0 1 Lucy 1 2 x 2 3 y 3 4 z 4 '''
#將df1 df2合並,以name為鍵(默認參數 how = 'inner' 內連接)
pd.merge(df1, df2, on = 'name', how = 'inner') # 內連接
''' name data1 data2 0 Carl 0 0 1 Lucy 1 1 '''
pd.merge(df1,df2,on = 'name',how = 'left') # 左連接
''' name data1 data2 0 Carl 0 0.0 1 Lucy 1 1.0 2 a 2 NaN 3 b 3 NaN 4 c 4 NaN '''
pd.merge(df1,df2,on = 'name',how = 'right') # 右連接
''' name data1 data2 0 Carl 0.0 0 1 Lucy 1.0 1 2 x NaN 2 3 y NaN 3 4 z NaN 4 '''
以索引作為連接鍵
left = DataFrame({'data':range(5),'name':['Carl','Lucy','a','b','c']})
right = DataFrame({'new_data':range(5),'new_name':['Carlnew','Lucynew','x','y','z']})
''' left data name 0 0 Carl 1 1 Lucy 2 2 a 3 3 b 4 4 c right new_data new_name 0 0 Carlnew 1 1 Lucynew 2 2 x 3 3 y 4 4 z '''
left.join(right)
''' data name new_data new_name 0 0 Carl 0 Carlnew 1 1 Lucy 1 Lucynew 2 2 a 2 x 3 3 b 3 y 4 4 c 4 z '''
2、pandas.concat() 方法
軸向連接,即沿着一條軸將多個對象堆疊到一起
''' a: a 0 b 1 dtype: int64 b: c 2 d 3 dtype: int64 c: e 4 f 5 dtype: int64 '''
pd.concat([a,c,b],axis = 0) #默認是按列堆疊
''' a 0 b 1 e 4 f 5 c 2 d 3 dtype: int64 '''
pd.concat([a,c,b],axis = 1) #按行堆疊
''' 0 1 2 a 0.0 NaN NaN b 1.0 NaN NaN e NaN 4.0 NaN f NaN 5.0 NaN c NaN NaN 2.0 d NaN NaN 3.0 '''
3、combine_first() 方法
作用 : 合並重疊數據
可以理解為打補丁操作:s1中有空缺的地方,從s2中拿來數據補上
from numpy import nan as Na
s1 = Series([Na,2.0,Na,4.0,Na,6.0],index = list('abcdef'))
s2 = Series([100.0,200.0,300.0,Na,Na,600.0],index = list('abcdef'))
''' s1 a NaN b 2.0 c NaN d 4.0 e NaN f 6.0 dtype: float64 s2 a 100.0 b 200.0 c 300.0 d NaN e NaN f 600.0 dtype: float64 '''
s1.combine_first(s2)
''' a 100.0 b 2.0 c 300.0 d 4.0 e NaN f 6.0 dtype: float64 '''
二、數據重塑/軸向旋轉
1、數據重塑
定義
重塑指的是將數據重新排列,也叫軸向旋轉
DataFrame提供了兩個方法:
- stack: 將數據的列 “旋轉” 為行
- unstack: 將數據的行“旋轉”為列
例如:
data = DataFrame(np.arange(9).reshape(3,3),index = pd.Index(['English','Math','Histioy'],name = 'Course'),columns= pd.Index(['Carl','Lucy','Petter'],name = 'Name'))
''' Name Carl Lucy Petter Course English 0 1 2 Math 3 4 5 Histioy 6 7 8 '''
data.stack()
''' Course Name English Carl 0 Lucy 1 Petter 2 Math Carl 3 Lucy 4 Petter 5 Histioy Carl 6 Lucy 7 Petter 8 dtype: int32 '''
data.unstack()
''' Name Course Carl English 0 Math 3 Histioy 6 Lucy English 1 Math 4 Histioy 7 Petter English 2 Math 5 Histioy 8 dtype: int32 '''
2、處理堆疊格式
堆疊格式也叫長格式,一般關系型數據庫存儲時間序列的數據會采用此種格式
雖然這種存儲格式對於關系型數據庫是好的,不僅保持了關系完整性還提供了方便的查詢支持,但是對於數據操作可能就不那么方便了,DataFrame的數據格式才更加方便。
pivot() 方法
df5 = DataFrame({'data':['1989-06-01','1989-04-25','1999-07-25'],'item':['Carl','Lucy','Peter'],'value':['60','41','44']})
''' data item value 0 1989-06-01 Carl 60 1 1989-04-25 Lucy 41 2 1999-07-25 Peter 44 '''
# df5.pivot(index=None, columns=None, values=None)
df5.pivot('data','item','value').fillna('空值')
''' item Carl Lucy Peter data 1989-04-25 空值 41 空值 1989-06-01 60 空值 空值 1999-07-25 空值 空值 44 '''
