SQL和Python的集合操作對比:適合的就好!
對于分析師或數(shù)據(jù)科學(xué)家而言,熟悉多種分析編程語言可以在當(dāng)今數(shù)據(jù)環(huán)境中贏得優(yōu)勢。在多語言法的主流對話中,尤其是SQL語言和Python語言,通常被描述為功能性離散。
SQL和Python都可以實現(xiàn)許多功能。探索兩種編程語言重疊的功能可以幫助只熟悉一種編程語言的人更加熟悉另一種編程語言。組合和利用每種編程語言,可以對其做出更明智的決策,并更好地為每個任務(wù)選擇合適的工具。了解如何在SQL或Python中完成任務(wù)將幫助你選擇出***的工作工具。
集合操作
分析式問題通常需要檢查多個不同的數(shù)據(jù)集。在解答過程中,通過比較或組合不同的數(shù)據(jù)集來創(chuàng)建一組新數(shù)據(jù)集,非常有效。
例如,你可能有兩個單獨的表,其中包含要轉(zhuǎn)換為單個事務(wù)表的事務(wù)性數(shù)據(jù),你想把它們合并為一個表,或者創(chuàng)建一個同時包含兩個表中數(shù)據(jù)的新事務(wù)表。
在SQL中,集合操作符可以解決這個問題。集合操作符支持對比性操作,可以有條件地連結(jié)兩個SQL語句的結(jié)果集。SQL集合操作符包括:
- UNION:從待比較的兩個查詢語句返回結(jié)果行。在默認(rèn)情況下,如果兩個SQL語句的結(jié)果集中存在相同的行,則UNION不會返回重復(fù)行。如果你想返回重復(fù)行,可以向集合操作符UNION提供可選ALL關(guān)鍵字。
 - INTERSECT:返回位于兩個待比較的查詢語句結(jié)果集中的行。
 - EXCEPT(或者M(jìn)INUS):返回到非待比較的查詢語句結(jié)果集中的行。
 
雖然Python中沒有特定的集合操作符種類,但Python中仍然有各種各樣的函數(shù)可以實現(xiàn)這些功能。
為了說明如何在實踐中使用這些集合操作,先假設(shè)你作為一名雙邊市場數(shù)據(jù)科學(xué)家。在你的市場中有買家和賣家,二者并不相互排斥?,F(xiàn)在,買賣雙方分別存在于buyers和sellers表格的數(shù)據(jù)庫中。讓我們來瀏覽一下集合操作可能發(fā)揮作用的幾種場景。
合并和合并所有
假設(shè)你想把存在于buyers和sellers表格中的所有用戶合并到一個新的單獨的“用戶”表格中。
在SQL中,你可以使用UNION操作符和可選ALL關(guān)鍵字來實現(xiàn):
- -- SQL
 - select user_id
 - from modeanalytics.buyers
 - union all
 - select user_id
 - from modeanalytics.sellers
 
在Python中,可以使用pandas .concat()函數(shù)復(fù)制上面執(zhí)行的UNION ALL集合操作。
pandas .concat()方法沿著選定的軸連接pandas對象(例如Dataframes,Series等)。假設(shè)您已將buyers和sellers數(shù)據(jù)庫表格中user_id字段存儲在兩個pandas數(shù)據(jù)框?qū)ο笾?buyers 和 sellers),你可以使用以下Python代碼復(fù)制上面執(zhí)行過的UNION ALL集合操作:
- # Python
 - users = pd.concat([buyers, sellers])
 
需要注意的是,在SQL中使用UNION和ALL關(guān)鍵字,或者在Python中使用pandas concat()方法,你將把存在于兩個表格中的用戶(用戶即是買家又是賣家)返回到重復(fù)行。但是,如果你只想返回存在于兩個表中的一個用戶的單一實例時:
在SQL中,從UNION集合操作符中移除ALL關(guān)鍵字:
- -- 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()
 
交集
反之,如果你想創(chuàng)建一個既是買家又是賣家的獨立用戶表格呢?
在SQL中,你可以使用INTERSECT集合操作符:
- -- SQL
 - select user_id
 - from modeanalytics.buyers
 - intersect
 - select user_id
 - from modeanalytics.sellers
 
在Python中,你可以在數(shù)據(jù)框中使用pandas .merge()方法:
- Python
 - buyers_and_sellers = buyers.merge(sellers)
 
默認(rèn)情況下,pandas .merge()方法將嘗試將兩個數(shù)據(jù)框中的所有列進(jìn)行“內(nèi)部”合并。此默認(rèn)操作基本復(fù)制了SQL集合操作符INTERSECT的步驟。
差集
現(xiàn)在,如果你想返回到所有買家用戶,而不是賣家用戶。
在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布爾索引技術(shù)和pandas .isin() 索引來復(fù)制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]`
 
模糊界限
到這里,你已經(jīng)了解了如何在Python中復(fù)制大量SQL集合操作符的功能。最終,編程模式的選擇取決于你,甚至可以在項目基礎(chǔ)上逐個改動。只有通過掌握分析語言功能上的重疊,才能有效做出決策。這就是使用多種數(shù)據(jù)分析語言的好處:你可以自定義一個混合方法來滿足你不斷發(fā)展的需求。















 
 
 









 
 
 
 