閱讀提示
本文將提到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
'''