- Python廣告數據挖掘與分析實戰
- 楊游云 周健
- 1705字
- 2021-04-02 14:21:23
3.2.3 數據拼接
當我們面對兩份或者多份數據時,常常需要對它們進行一些拼接、合并操作來整合我們想要的數據。Pandas提供了merge、join、concat等多種方法來幫助我們快速完成這些數據拼接任務。
1.merge方法
Pandas的merge方法是基于共同的列將兩個數據表連接起來。如果你熟悉關系型數據庫,那么你會發現merge方法和關系型數據庫中的join其實是一致的。merge方法的主要參數說明如表3-5所示。
表3-5 merge方法的主要參數

下面介紹merge方法中how參數指定的四種連接的含義及具體實現。
1)how=‘inner’表示內連接,即基于兩個表的共同列取交集,如圖3-2所示。

圖3-2 內連接
假設存在如下兩張表,分別為left_df和right_df。
In [65]: left_df Out[65]: ID Name 0 1 A 1 2 B 2 3 C 3 4 D 4 5 E In [66]: right_df Out[66]: Age ID 0 18 1 1 19 2 2 16 3 3 50 5 4 20 6
可以通過指定共同列ID進行內連接,得到結果df1。
In [67]: df1 = pd.merge(left_df,right_df,how = 'inner',on = 'ID') In [68]: df1 Out[68]: ID Name Age 0 1 A 18 1 2 B 19 2 3 C 16 3 5 E 50
可以發現,原來的left_df和right_df表中各有5行數據,而內連接結果df1中只有4行數據,并且df1的ID列中只有1、2、3、5四個值,這剛好是left_df中ID列和right_df中ID列同時包含的值。而left_df的ID列中的4和right_df的ID列中的6均為單獨存在,所以沒有在內連接的結果中出現。
2)how=‘left’表示左連接,即基于左表的列進行連接,返回左表的全部行和右表滿足ON條件的行,得到結果df2。如果左表的行在右表中沒有匹配,那么這一行右表中的對應數據用NaN代替。左連接的示意圖如圖3-3所示。

圖3-3 左連接
代碼如下:
In [69]: df2 = pd.merge(left_df,right_df,how = 'left',on = 'ID') In [70]: df2 Out[70]: ID Name Age 0 1 A 18.0 1 2 B 19.0 2 3 C 16.0 3 4 D NaN 4 5 E 50.0
在左連接的結果df2中,ID列返回left_df中的所有ID值,不包括出現在right_df中而沒有出現在left_df中的其他值,比如6。而在right_df中沒有出現的ID值是4,所以左連接結果中ID=4的Age列的值為NaN。
3)how=‘right’表示右連接,與左連接剛好相反,它是基于右表的列進行連接的,返回右表的全部行和左表滿足ON條件的行,得到結果df3。如果右表的行在左表中沒有匹配,那么這一行左表中的對應數據用NaN代替。右連接的示意圖如圖3-4所示。

圖3-4 右連接
代碼如下:
In [71]: df3 = pd.merge(left_df,right_df,how = 'right',on = 'ID') In [72]: df3 Out[72]: ID Name Age 0 1 A 18 1 2 B 19 2 3 C 16 3 5 E 50 4 6 NaN 20
在右連接的結果df3中,ID列返回right_df中的所有ID值,不包括出現在left_df中而沒有出現在right_df中的其他值,比如4。而在left_df中沒有出現的ID值是6,所以結果df3中ID=6的Name列的值為NaN。
4)how=‘outer’表示外連接,其結果會返回左表和右表所有的行,對應結果df4。如果其中一個表數據的行在另一個表中沒有匹配到,那么沒有匹配到的數據就用NaN代替。外連接的示意圖如圖3-5所示。

圖3-5 外連接
代碼如下:
In [73]: df4 = pd.merge(left_df,right_df,how = 'outer',on = 'ID') In [74]: df4 Out[74]: ID Name Age 0 1 A 18.0 1 2 B 19.0 2 3 C 16.0 3 4 D NaN 4 5 E 50.0 5 6 NaN 20.0
在外連接的結果df4中,ID列返回right_df和left_df中的所有ID值。例如,在left_df中沒有出現的值6,在df4中ID=6的Name列的值為NaN;在right_df中沒有出現的值4,在df4中ID=4的Age列的值為NaN。
如果是基于多列的連接,將所有列名組成列表形式傳給on參數即可:
In [75]: left_df2 = pd.DataFrame({"ID":[1,2,3,4,5], ...: "No":[100,101,102,103,104], ...: "Name":['A',"B","C","D","E"]}) In [76]: right_df2 = pd.DataFrame({"ID":[1,2,3,5,6], ...: "No":[100,101,102,103,105], ...: "Age":[18,19,16,50,20]}) In [77]: df5=pd.merge(left_df2,right_df2,how = 'left',on = ['ID','No']) In [78]: df5 Out[78]: ID Name No Age 0 1 A 100 18.0 1 2 B 101 19.0 2 3 C 102 16.0 3 4 D 103 NaN 4 5 E 104 NaN
關于merge方法中的其他參數,感興趣的讀者可以自行嘗試。
2.join方法
join方法主要基于兩個DataFrame的索引進行合并。join方法和merge方法類似,同樣也可以實現四種連接方式,但join方法是基于索引進行連接,而merge方法既可以基于列連接也可以基于索引拼接。當然我們還可以通過將列設置成索引再使用join方法連接。但在一般情況下,我們都是直接采用merge方法連接。
這里是使用join方法進行左連接的簡單示例。
In [79]: left_df.join(right_df,lsuffix="_left",rsuffix="_right") Out[79]: ID_left Name Age ID_right 0 1 A 18 1 1 2 B 19 2 2 3 C 16 3 3 4 D 50 5 4 5 E 20 6
其他連接方式與merge方法類似,這里不再贅述。
3.concat方法
concat方法主要是對Series或DataFrame進行行拼接或列拼接。concat方法中的主要參數及其說明如表3-6所示。
表3-6 concat方法中的參數

(1)行拼接
將多張具有相同字段的表進行拼接,比如將一年中四個季度各類廣告投放產品的消耗情況表進行行拼接,形成年度消耗情況表,如果某張表中不存在該字段,則拼接后該字段的值為NaN。
In [80]: df1 = pd.DataFrame({'A': [100,102,50,580], 'B': [2,5,6,8]}) In [81]: df2 = pd.DataFrame({'A': [20,30,30,60],'C': [1,2,3,5]}) In [82]: pd.concat([df1,df2]) Out[82]: A B C 0 100 2.0 NaN 1 102 5.0 NaN 2 50 6.0 NaN 3 580 8.0 NaN 0 20 NaN 1.0 1 30 NaN 2.0 2 30 NaN 3.0 3 60 NaN 5.0
(2)列拼接
要實現列拼接,只要修改axis=1即可,作用與merge方法、join方法一樣,不過concat方法不支持左連接和右連接。
In [83]: pd.concat([left_df,right_df],axis=1) Out[83]: ID Name Age ID 0 1 A 18 1 1 2 B 19 2 2 3 C 16 3 3 4 D 50 5 4 5 E 20 6
- 信息系統與數據科學
- 計算機信息技術基礎實驗與習題
- Effective Amazon Machine Learning
- App+軟件+游戲+網站界面設計教程
- Access 2007數據庫應用上機指導與練習
- 大數據:規劃、實施、運維
- OracleDBA實戰攻略:運維管理、診斷優化、高可用與最佳實踐
- Starling Game Development Essentials
- 數字媒體交互設計(初級):Web產品交互設計方法與案例
- Python金融數據分析(原書第2版)
- 金融商業算法建模:基于Python和SAS
- 淘寶、天貓電商數據分析與挖掘實戰(第2版)
- MySQL技術內幕:SQL編程
- Hadoop 3實戰指南
- 區域云計算和大數據產業發展:浙江樣板