1. 程式人生 > 其它 >5個例子介紹Pandas的merge並對比SQL中join

5個例子介紹Pandas的merge並對比SQL中join

技術標籤:資料探勘pandasmysqlsql

本文的重點是在合併和連線操作方面比較Pandas和SQL。Pandas是一個用於Python的資料分析和操作庫。SQL是一種用於管理關係資料庫中的資料的程式語言。兩者都使用帶標籤的行和列的表格資料。

Pandas的merge函式根據公共列中的值組合dataframe。SQL中的join可以執行相同的操作。這些操作非常有用,特別是當我們在表的不同資料中具有共同的資料列(即資料點)時。

pandas的merge圖解

我建立了兩個簡單的dataframe和表,通過示例來說明合併和連線。

“cust”包含5個客戶的3條資訊。列是id、年齡和類別。

“purc”包含客戶id、機票號碼和購買金額。

id是共同列的列,所以我們將在合併或聯接時使用它。

您可能已經注意到,id列並不完全相同。有些值只存在於一個dataframe中。我們將在示例中看到處理它們的方法。

示例1

第一個示例是基於id列中的共享值進行合併或連線。使用預設設定完成了這個任務,所以我們不需要調整任何引數。

import pandas as pd
cust.merge(purc, on='id')

Pandas的merge函式不會返回重複的列。另一方面,如果我們選擇兩個表中的所有列(“*”),則在SQL join中id列是重複的。

mysql> select cust.*, purc.*
    -> from cust join purc 
    -> on cust.id = purc.id
    
;+------+------+------+------+--------+--------+
| id   | age  | ctg  | id   | ticket | amount |
+------+------+------+------+--------+--------+
|    3 |   22 | B    |    3 |   1001 |  24.10 |
|    4 |   29 | C    |    4 |   1002 |  32.50 |
|    5 |   17 | B    |    5 |   1003 |  34.80 |
+------+------+------+------+--------+--------+

示例2

假設我們希望左表中有所有的行,而右表中只有匹配的行。在Pandas中,on引數被更改為“left”。在SQL中,我們使用“left join”而不是“join”關鍵字。

cust.merge(purc, on='id', how='left')

mysql> select cust.*, purc.*
    -> from cust
    -> left join purc
    -> on cust.id = purc.id

;+------+------+------+------+--------+--------+
| id   | age  | ctg  | id   | ticket | amount |
+------+------+------+------+--------+--------+
|    3 |   22 | B    |    3 |   1001 |  24.10 |
|    4 |   29 | C    |    4 |   1002 |  32.50 |
|    5 |   17 | B    |    5 |   1003 |  34.80 |
|    1 |   34 | A    | NULL |   NULL |   NULL |
|    2 |   28 | A    | NULL |   NULL |   NULL |

purcdataframe和表中沒有id為1或2的行。因此,purc中的列中填充了這些行的空值。

示例3

如果我們想要看到兩個dataframe或表中的所有行,該怎麼辦?

在Pandas中,這是一個簡單的操作,可以通過將’ outer '引數傳遞給on形參來完成。

cust.merge(purc, on='id', how='outer')

MySQL沒有提供“完整的外連線”,但是我們可以通過兩個左連線來實現。

注意:儘管關係資料庫管理系統(rdbms)採用的SQL語法基本相同,但可能會有一些細微的差異。因此,最好檢查特定RDBMS的文件,看看它是否支援完整的外部連線。

在MySQL中,完整的外連線可以通過兩個左連線實現:

mysql> select cust.*, purc.*
    -> from cust left join purc
    -> on cust.id = purc.id
    -> union
    -> select cust.*, purc.*
    -> from purc left join cust
    -> on cust.id = purc.id
;+------+------+------+------+--------+--------+
| id   | age  | ctg  | id   | ticket | amount |
+------+------+------+------+--------+--------+
|    3 |   22 | B    |    3 |   1001 |  24.10 |
|    4 |   29 | C    |    4 |   1002 |  32.50 |
|    5 |   17 | B    |    5 |   1003 |  34.80 |
|    1 |   34 | A    | NULL |   NULL |   NULL |
|    2 |   28 | A    | NULL |   NULL |   NULL |
| NULL | NULL | NULL |    6 |   1004 |  19.50 |
| NULL | NULL | NULL |    7 |   1005 |  26.20 |
+------+------+------+------+--------+--------+

union操作符將多個查詢的結果堆疊起來。這類似於Pandas的concat功能。

示例4

合併或聯接不僅僅是合併資料。我們可以把它們作為資料分析的工具。例如,我們可以計算每個類別(“ctg”)的總訂單金額。

cust.merge(purc, on='id', how='left')[['ctg','amount']].groupby('ctg').mean()
                
ctg     amount
--------------                             
A       NaN                 
B       29.45                 
C       32.50

因為purc表不包含任何屬於類別A中的客戶的購買,所以sum結果為Null。

mysql> select cust.ctg, sum(purc.amount)
    -> from cust
    -> left join purc
    -> on cust.id = purc.id
    -> group by cust.ctg
;+------+------------------+
| ctg  | sum(purc.amount) |
+------+------------------+
| A    |             NULL |
| B    |            58.90 |
| C    |            32.50 |
+------+------------------+

示例5

我們還可以在組合之前根據條件篩選行。讓我們假設我們需要找到小於25歲的客戶的購買量。

對於pandas 我們首先過濾dataframe,然後應用合併函式。

cust[cust.age < 25].merge(purc, on='id', how='left')[['age','amount']]       

age     amount                       
0       22       24.1                 
1       17       34.8

mysql使用一個where子句來指定過濾條件。

mysql> select cust.age, purc.amount
    -> from cust
    -> join purc
    -> on cust.id = purc.id
    -> where cust.age < 25
;+------+--------+
| age  | amount |
+------+--------+
|   22 |  24.10 |
|   17 |  34.80 |
+------+--------+

總結

我們已經介紹了一些示例來演示Pandas合併函式和SQL連線之間的區別和相似之處。

這些例子可以看作是簡單的案例,但是它們可以幫助您建立直覺並理解基礎知識。在理解了基礎知識之後,您可以構建更高階的操作。

作者:Soner Yıldırım

原文地址:https://towardsdatascience.com/pandas-vs-sql-in-5-examples-485b5571d934

das合併函式和SQL連線之間的區別和相似之處。

這些例子可以看作是簡單的案例,但是它們可以幫助您建立直覺並理解基礎知識。在理解了基礎知識之後,您可以構建更高階的操作。

作者:Soner Yıldırım

deephub翻譯組