2020年入門(mén)數(shù)據(jù)分析選擇Python還是SQL?七個(gè)常用操作對(duì)比!

SQL和Python幾乎是當(dāng)前數(shù)據(jù)分析師必須要了解的兩門(mén)語(yǔ)言,它們?cè)谔幚頂?shù)據(jù)時(shí)有什么區(qū)別?本文將分別用MySQL和pandas來(lái)展示七個(gè)在數(shù)據(jù)分析中常用的操作,希望可以幫助掌握其中一種語(yǔ)言的讀者快速了解另一種方法!
在閱讀本文前,你可以訪(fǎng)問(wèn)下方網(wǎng)站下載本文使用的示例數(shù)據(jù),并導(dǎo)入MySQL與pandas中,一邊敲代碼一邊閱讀!
https://raw.githubusercontent.com/pandas-dev/pandas/master/pandas/tests/io/data/csv/tips.csv? 一、選擇
在SQL中,我們可以使用SELECT語(yǔ)句從表選擇數(shù)據(jù),結(jié)果被存儲(chǔ)在一個(gè)結(jié)果表中,語(yǔ)法如下:
SELECT?column_name,column_name
FROM?table_name;
如果不想顯示全部的記錄,可以使用TOP或LIMIT來(lái)限制行數(shù)。因此選擇tips表中的部分列可以使用下面的語(yǔ)句
SELECT?total_bill,?tip,?smoker,?time
FROM?tips
LIMIT?5;

而在pandas中,我們可以通過(guò)將列名列表傳遞給DataFrame來(lái)完成列選擇
在SQL中,進(jìn)行選擇的同時(shí)還可以進(jìn)行計(jì)算,比如添加一列
SELECT?*,?tip/total_bill?as?tip_rate
FROM?tips
LIMIT?5;
在pandas中使用DataFrame.assign()同樣可以完成這個(gè)操作
? 二、查找
單條件查找
在SQL中,WHERE子句用于提取那些滿(mǎn)足指定條件的記錄,語(yǔ)法如下
SELECT?column_name,column_name
FROM?table_name
WHERE?column_name?operator?value;
比如查找示例數(shù)據(jù)中time = dinner的記錄
SELECT?*
FROM?tips
WHERE?time?=?'Dinner'
LIMIT?5;
而在pandas中,按照條件進(jìn)行查找則可以有多種形式,比如可以將含有True/False的Series對(duì)象傳遞給DataFrame,并返回所有帶有True的行
多條件查找
在SQL中,進(jìn)行多條件查找可以使用AND/OR來(lái)完成
SELECT?*
FROM?tips
WHERE?time?=?'Dinner'?AND?tip?>?5.00;
在pandas中也有類(lèi)似的操作
查找空值
在pandas檢查空值是使用notna()和isna()方法完成的。
frame[frame['col1'].notna()]
在SQL中可以使用IS NULL和IS NOT NULL完成
SELECT?*
FROM?frame
WHERE?col2?IS?NULL;
SELECT?*
FROM?frame
WHERE?col1?IS?NOT?NULL;? 三、更新
在SQL中使用UPDATE
UPDATE?tips
SET?tip?=?tip*2
WHERE?tip?2;
而在pandas中則有多種方法,比如使用loc函數(shù)
tips.loc[tips['tip']?2,?'tip']?*=?2? 四、刪除
在SQL中使用DELETE
DELETE?FROM?tips
WHERE?tip?>?9;
在pandas中,我們選擇應(yīng)保留的行,而不是刪除它們
tips?=?tips.loc[tips['tip']?<=?9]? 五、分組
在pandas中,使用groupby()方法實(shí)現(xiàn)分組。groupby()通常是指一個(gè)過(guò)程,在該過(guò)程中,我們希望將數(shù)據(jù)集分為幾組,應(yīng)用某些功能(通常是聚合),然后將各組組合在一起。
常見(jiàn)的SQL操作是獲取整個(gè)數(shù)據(jù)集中每個(gè)組中的記錄數(shù)。例如,通過(guò)對(duì)性別進(jìn)行分組查詢(xún)
SELECT?sex,?count(*)
FROM?tips
GROUP?BY?sex;
在pandas中的等價(jià)操作為
注意,在上面代碼中,我們使用size()而不是count() 這是因?yàn)閏ount()將函數(shù)應(yīng)用于每一列,并返回每一列中非空記錄的數(shù)量!
? 六、連接
在pandas可以使用join()或merge()進(jìn)行連接,每種方法都有參數(shù),可讓指定要執(zhí)行的聯(lián)接類(lèi)型(LEFT,RIGHT,INNER,F(xiàn)ULL)或要聯(lián)接的列。
現(xiàn)在讓我們重新創(chuàng)建兩組示例數(shù)據(jù),分別用代碼來(lái)演示不同的連接
df1?=?pd.DataFrame({'key':?['A',?'B',?'C',?'D'],
???....:?????????????????????'value':?np.random.randn(4)})
???....:?
df2?=?pd.DataFrame({'key':?['B',?'D',?'D',?'E'],
???....:?????????????????????'value':?np.random.randn(4)})
內(nèi)連接
內(nèi)聯(lián)接使用比較運(yùn)算符根據(jù)每個(gè)表共有的列的值匹配兩個(gè)表中的行,在SQL中實(shí)現(xiàn)內(nèi)連接使用INNER JOIN
SELECT?*
FROM?df1
INNER?JOIN?df2
??ON?df1.key?=?df2.key;
在pandas中可以使用merge()
merge()提供了一些參數(shù),可以將一個(gè)DataFrame的列與另一個(gè)DataFrame的索引連接在一起?
左/右外聯(lián)接
在SQL中實(shí)現(xiàn)左/右外連接可以使用LEFT OUTER JOIN和RIGHT OUTER JOIN
SELECT?*
FROM?df1
LEFT?OUTER?JOIN?df2
??ON?df1.key?=?df2.key;
??
SELECT?*
FROM?df1
RIGHT?OUTER?JOIN?df2
??ON?df1.key?=?df2.key;
在pandas中實(shí)現(xiàn)同樣可以使用merge()并指定how關(guān)鍵字為left或者right即可
全連接
全連接返回左表和右表中的所有行,無(wú)論是否匹配,但并不是所有的數(shù)據(jù)庫(kù)都支持,比如mysql就不支持,在SQL中實(shí)現(xiàn)全連接可以使用FULL OUTER JOIN
SELECT?*
FROM?df1
FULL?OUTER?JOIN?df2
??ON?df1.key?=?df2.key;
在pandas中實(shí)現(xiàn)同樣可以使用merge()并指定how關(guān)鍵字為outer
? 七、合并
SQL中UNION操作用于合并兩個(gè)或多個(gè)SELECT語(yǔ)句的結(jié)果集,UNION與UNION ALL類(lèi)似,但是UNION將刪除重復(fù)的行。示例代碼如下
SELECT?city,?rank
FROM?df1
UNION?ALL
SELECT?city,?rank
FROM?df2;
/*
?????????city??rank
??????Chicago?????1
San?Francisco?????2
New?York?City?????3
??????Chicago?????1
???????Boston?????4
??Los?Angeles?????5
*/
在pandas中可以使用concat()實(shí)現(xiàn)UNION ALL
上面是UNION ALL保留重復(fù)值,如果希望刪除可以使用 ?drop_duplicates()
以上就是本文的全部?jī)?nèi)容,可以看到在不同的場(chǎng)景下不同的語(yǔ)言有著不同的特性,如果你想深入學(xué)習(xí)了解可以進(jìn)一步查閱官方文檔并多加練習(xí)!
-END-
來(lái)源:pandas官方文檔
https://pandas.pydata.org/docs/getting_started/comparison/comparison_with_sql.html
編譯:劉早起(有刪改)
文末推薦一本數(shù)據(jù)分析相關(guān)的書(shū):Python數(shù)據(jù)分析與大數(shù)據(jù)處理(本書(shū)主要講解數(shù)據(jù)分析與大數(shù)據(jù)處理所需的技術(shù)、基礎(chǔ)設(shè)施、核心概念、實(shí)施流程。從編程語(yǔ)言準(zhǔn)備、數(shù)據(jù)采集與清洗、數(shù)據(jù)分析與可視化,到大型數(shù)據(jù)的分布式存儲(chǔ)與分布式計(jì)算,貫穿了整個(gè)大數(shù)據(jù)項(xiàng)目開(kāi)發(fā)流程。本書(shū)輕理論、重實(shí)踐,目的是讓讀者快速上手)現(xiàn)在京東和當(dāng)當(dāng)都有優(yōu)惠活動(dòng),點(diǎn)擊下方圖片查看詳情!

