一起學習,一起成長!
什麼是軸向連接?在學習軸向連接數據合并運算前,我們需要先理解,什麼是軸向連接?
數據處理與分析,特别是進行數據可視化時,會接觸到x軸或y軸這樣的概念。比如說,x軸代表的年齡,y軸代表的是收入,通常做的數據分析則是不同年齡的人平均收入情況。從這個例子中可以發現,軸代表的是一個變量或者稱為數據表中的一個字段。而本文中的軸向連接中的”軸向“含義類似,則代表是數據方向,即列,還是行。
所以簡單理解,軸向連接指的是數據按照列向進行連接,還是按照行向進行連接。
接下來,我們先使用Numpy創建一個數組,來理解一下什麼是“軸向連接”:
In [12]: import numpy as np In [13]: arr=np.arange(12).reshape((3,4)) In [14]: arr Out[14]: array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]])
然後使用Numpy的concatenation的函數,進行數據連接:
In [15]: np.concatenate([arr,arr],axis=1) Out[15]: array([[ 0, 1, 2, 3, 0, 1, 2, 3], [ 4, 5, 6, 7, 4, 5, 6, 7], [ 8, 9, 10, 11, 8, 9, 10, 11]])
通過上述結果可以發現,數組按照列向,進行列數據合并。除了Numpy,python中最為豐富且靈活,應用最為便捷且廣泛的數據軸向連接函數是pandas 中的concat()函數。豐富的concat()函數參數,讓其支持的應用場景足夠滿足實際需求。我們将會在下文中進行詳細介紹。
使用pandas的concat()函數進行軸向連接對于pandas對象(如Series和DataFrame),帶有标簽的軸使你能夠進一步推廣數組的連接運算。具體點說,開需要考慮一下這些東西:
Pandas的concat函數提供了一種能夠解決這些問題的可靠方式。
将值和索引粘合:concat()具體查看concat函數效果前,我們需要創建3個數據集,具體如下:
In [17]: s1=Series([0,1],index=['a','b']) In [18]: s2=Series([2,3,4],index=['c','d','e']) In [19]: s3=Series([5,6],index=['f','g'])
對這些對象調用concat函數将值和索引粘合在一起:
In [8]: pd.concat([s1,s2,s3]) Out[8]: a 0 b 1 c 2 d 3 e 4 f 5 g 6 dtype: int64
默認情況下,concat是在axis=0上工作的,最終産生一個新的Series。如果傳入axis=1,則結果就會變成一個DataFrame(axis=1是列)。
In [9]: pd.concat([s1,s2,s3],axis=1) Out[9]: 0 1 2 a 0.0 NaN NaN b 1.0 NaN NaN c NaN 2.0 NaN d NaN 3.0 NaN e NaN 4.0 NaN f NaN NaN 5.0 g NaN NaN 6.0
這種情況下,另外一條軸上沒有重疊,從索引的有序并集(外連接)上就可以看出來。傳入join=’inner’即可得到它們的交集。
軸向交集:join=’inner’In [10]: s4=pd.concat([s1*5,s3]) In [11]: s4 Out[11]: a 0 b 5 f 5 g 6 dtype: int64 In [12]: pd.concat([s1,s4],axis=1) Out[12]: 0 1 a 0.0 0 b 1.0 5 f NaN 5 g NaN 6 In [13]: pd.concat([s1,s4],axis=1,join='inner') Out[13]: 0 1 a 0 0 b 1 5
join_axes:指定在其他軸上使用的索引可以通過join_axes指定要在其他軸上使用的索引:
In [14]: pd.concat([s1,s4],axis=1,join_axes=[['a','c','b','e']]) Out[14]: 0 1 a 0.0 0.0 c NaN NaN b 1.0 5.0 e NaN NaN
不過有個問題,參與連接的片段在結果中區分不開。假設想要在連接軸上創建一個層次化索引。使用keys參數即可達到這個目的:
In [15]: result=pd.concat([s1,s2,s3],keys=['one','two','three']) In [16]: result Out[16]: one a 0 b 1 two c 2 d 3 e 4 three f 5 g 6 dtype: int64
軸變換:unstack()In [17]: result.unstack() Out[17]: a b c d e f g one 0.0 1.0 NaN NaN NaN NaN NaN two NaN NaN 2.0 3.0 4.0 NaN NaN three NaN NaN NaN NaN NaN 5.0 6.0
如果沿着axis=1對Series進行合并,則keys就會成為DataFrame的列頭:
In [18]: pd.concat([s1,s2,s3],axis=1,keys=['one','two','three']) Out[18]: one two three a 0.0 NaN NaN b 1.0 NaN NaN c NaN 2.0 NaN d NaN 3.0 NaN e NaN 4.0 NaN f NaN NaN 5.0 g NaN NaN 6.0同樣的邏輯對DataFrame對象也是一樣:
同樣的邏輯對DataFrame對象也是一樣:
In [19]: df1=DataFrame(np.arange(6).reshape(3,2), index=['a','b','c'],columns=['one','two']) In [20]: df2=DataFrame(5 np.arange(4).reshape(2,2), index=['a','c'],columns=['three','four']) In [21]: df1 Out[21]: one two a 0 1 b 2 3 c 4 5 In [22]: df2 Out[22]: three four a 5 6 c 7 8 In [23]: pd.concat([df1,df2],axis=1,keys=['level1','level2']) Out[23]: level1 level2 one two three four a 0 1 5.0 6.0 b 2 3 NaN NaN c 4 5 7.0 8.0
如果傳入的不是列表而是一個字典,則字典的鍵就會被當作keys選項的值:
In [24]: pd.concat({'level1':df1,'level2':df2}) Out[24]: four one three two level1 a NaN 0.0 NaN 1.0 b NaN 2.0 NaN 3.0 c NaN 4.0 NaN 5.0 level2 a 6.0 NaN 5.0 NaN c 8.0 NaN 7.0 NaN In [25]: pd.concat({'level1':df1,'level2':df2},axis=1) Out[25]: level1 level2 one two three four a 0 1 5.0 6.0 b 2 3 NaN NaN c 4 5 7.0 8.0
names參數此外還有兩個用于管理層次化索引創建的參數:
In [26]: pd.concat([df1,df2],axis=1,keys=['level1','level2'], names=['upper','lower']) Out[26]: upper level1 level2 lower one two three four a 0 1 5.0 6.0 b 2 3 NaN NaN c 4 5 7.0 8.0
DataFrame行索引:ignore_index=True最後一個需要考慮的問題是,跟當錢分析工作無關的DataFrame行索引:
In [27]: df1=DataFrame(np.random.randn(3,4),columns=['a','b','c','d']) In [28]: df2=DataFrame(np.random.randn(2,3),columns=['b','d','a']) In [29]: df1 Out[29]: a b c d 0 0.032443 1.113210 0.502779 -1.227075 1 -0.613984 -0.204040 -0.630603 0.341598 2 0.746166 1.518603 0.533425 0.320373 In [30]: df2 Out[30]: b d a 0 -0.350900 0.851649 0.959348 1 -0.071497 1.916604 -0.993156
在這種情況下,傳入ignore_index=True即可:
In [31]: pd.concat([df1,df2],ignore_index=True) Out[31]: a b c d 0 0.032443 1.113210 0.502779 -1.227075 1 -0.613984 -0.204040 -0.630603 0.341598 2 0.746166 1.518603 0.533425 0.320373 3 0.959348 -0.350900 NaN 0.851649 4 -0.993156 -0.071497 NaN 1.916604
總體來說,6種軸向連接的pandas方法幾乎覆蓋到了數據合并場景。
大家可以依據上述内容進行實踐,如遇問題,歡迎留言!喜歡的别忘記加個關注!感謝支持!
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!