SQL和Python的集合操作對比:適合的就是最好的

程序員小樂 發佈 2020-01-21T15:19:15+00:00

Be true to who you are. Stop trying to please other people or be someone else. It’s better to be an original version of yourself than an exa

點擊上方 "程式設計師小樂"關注, 星標或置頂一起成長

每天凌晨00點00分, 第一時間與你相約


每日英文

Be true to who you are. Stop trying to please other people or be someone else. It’s better to be an original version of yourself than an exact duplicate of someone else.

做真實的自己,不要為了取悅別人或試圖成為某個人。做你最原始的自己,比做任何人的複製品都來得好。


每日掏心話

大多數人的壓力,來自於不假思索跟著大部隊走。大部隊說,要先有錢才能有面子,於是終日焦慮財富不夠,忘了品味生活。



來自:讀芯術 | 責編:樂樂

程式設計師小樂(ID:study_tech)第 752 次推文 圖片來自 Pexels


往日回顧:重磅!美國對巴西發出警告:敢用華為就降低安全級別,巴西霸氣回應!


正文


對於分析師或數據科學家而言,熟悉多種分析程式語言可以在當今數據環境中贏得優勢。在多語言法的主流對話中,尤其是SQL語言和Python語言,通常被描述為功能性離散。



SQL和Python都可以實現許多功能。探索兩種程式語言重疊的功能可以幫助只熟悉一種程式語言的人更加熟悉另一種程式語言。組合和利用每種程式語言,可以對其做出更明智的決策,並更好地為每個任務選擇合適的工具。了解如何在SQL或Python中完成任務將幫助你選擇出最佳的工作工具。


集合操作


分析式問題通常需要檢查多個不同的數據集。在解答過程中,通過比較或組合不同的數據集來創建一組新數據集,非常有效。


例如,你可能有兩個單獨的表,其中包含要轉換為單個事務表的事務性數據,你想把它們合併為一個表,或者創建一個同時包含兩個表中數據的新事務表。


在SQL中,集合操作符可以解決這個問題。集合操作符支持對比性操作,可以有條件地連結兩個SQL語句的結果集。SQL集合操作符包括:


· UNION:從待比較的兩個查詢語句返回結果行。在默認情況下,如果兩個SQL語句的結果集中存在相同的行,則UNION不會返回重複行。如果你想返回重複行,可以向集合操作符UNION提供可選ALL關鍵字。


· INTERSECT:返回位於兩個待比較的查詢語句結果集中的行。


· EXCEPT(或者MINUS):返回到非待比較的查詢語句結果集中的行。


雖然Python中沒有特定的集合操作符種類,但Python中仍然有各種各樣的函數可以實現這些功能。


為了說明如何在實踐中使用這些集合操作,先假設你作為一名雙邊市場數據科學家。在你的市場中有買家和賣家,二者並不相互排斥。現在,買賣雙方分別存在於buyers和sellers表格的資料庫中。讓我們來瀏覽一下集合操作可能發揮作用的幾種場景。


合併和合併所有


假設你想把存在於buyers和sellers表格中的所有用戶合併到一個新的單獨的「用戶」表格中。


在SQL中,你可以使用UNION操作符和可選ALL關鍵字來實現:


-- SQL

select user_id

from modeanalytics.buyers

union all

select user_id

from modeanalytics.sellers


在Python中,可以使用pandas .concat()函數複製上面執行的UNION ALL集合操作。


pandas .concat()方法沿著選定的軸連接pandas對象(例如Dataframes,Series等)。假設您已將buyers和sellers資料庫表格中user_id欄位存儲在兩個pandas數據框對象中(buyers 和 sellers),你可以使用以下Python代碼複製上面執行過的UNION ALL集合操作:


# Python

users = pd.concat([buyers, sellers])


需要注意的是,在SQL中使用UNION和ALL關鍵字,或者在Python中使用pandas concat()方法,你將把存在於兩個表格中的用戶(用戶即是買家又是賣家)返回到重複行。但是,如果你只想返回存在於兩個表中的一個用戶的單一實例時:


在SQL中,從UNION集合操作符中移除ALL關鍵字:


-- SQL

select user_id

from modeanalytics.buyers

union

select user_id

from modeanalytics.sellers


在Python中,將.drop_duplicates()方法連結在連接pandas對象上:


# Python

users = pd.concat([buyers, sellers]).drop_duplicates()


交集


反之,如果你想創建一個既是買家又是賣家的獨立用戶表格呢?


在SQL中,你可以使用INTERSECT集合操作符:


-- SQL

select user_id

from modeanalytics.buyers

intersect

select user_id

from modeanalytics.sellers


在Python中,你可以在數據框中使用pandas .merge()方法:


Python

buyers_and_sellers = buyers.merge(sellers)


默認情況下,pandas .merge()方法將嘗試將兩個數據框中的所有列進行「內部」合併。此默認操作基本複製了SQL集合操作符INTERSECT的步驟。


差集


現在,如果你想返回到所有買家用戶,而不是賣家用戶。


在SQL中,你可以使用EXCEPT集合操作:


-- SQL

select user_id

from modeanalytics.buyers

except

select user_id

from modeanalytics.sellers


值得注意的是,SQL的EXCEPT集合操作符只能返回到第一個表格,不能返回到第二個表格。如果你想要返回到賣方的表格中,你需要顛倒SELECT語句的順序:


-- SQL

select user_id

from modeanalytics.sellers

except

select user_id

from modeanalytics.buyers


在Python中,利用pandas布爾索引技術和pandas .isin() 索引來複製SQL EXCEPT集合操作符的功能:


# Python

buyers_not_sellers = buyers[buyers.user_id.isin(sellers.user_id) == False]

sellers_not_buyers = sellers[sellers.user_id.isin(buyers.user_id) == False]`


模糊界限


到這裡,你已經了解了如何在Python中複製大量SQL集合操作符的功能。最終,編程模式的選擇取決於你,甚至可以在項目基礎上逐個改動。只有通過掌握分析語言功能上的重疊,才能有效做出決策。這就是使用多種數據分析語言的好處:你可以自定義一個混合方法來滿足你不斷發展的需求。


歡迎在留言區留下你的觀點,一起討論提高。如果今天的文章讓你有新的啟發,學習能力的提升上有新的認識,歡迎轉發分享給更多人。


猜你還想看


阿里、騰訊、百度、華為、京東最新面試題匯集

Java中關於try、catch、finally中的細節分析,看了都說好!

IDEA熱部署之JRebel的安裝與破解教程

為什麼要看源碼?如何看源碼?高手進階必看!


關注「程式設計師小樂」,收看更多精彩內容
嘿,你在看嗎?


關鍵字: