5個例子介紹Pandas的merge並對比SQL中join
本文的重點是在合併和連線操作方面比較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翻譯組