sql和python的区别_数据处理简单对比:Excel,SQL,Python
前言
無論是什么工具,做數據分析的時候一定會涉及到兩類工作:
合并多個關聯表
做數據透視表
這篇文章簡單對比一下Excel、SQL和Python在這兩類任務上的實現過程,從而對比其異同。
用到的數據表
01
如圖所示,所涉及的共有三個表:
student:sno 學生學號,sname 學生姓名,ssex 性別,sbirthday 學生生日,class 學生所在班級號;
course:cno 課程號,cname 課程名;
score:sno 學生學號,cno 學生選修課程對應的課程號,degree 學生所選課程對應的課程分數。
可以看到,score表通過sno和student表連接、通過cno和course表連接。
另外,這張截圖截自Excel,主要是為了方便后面Excel部分的討論。
合并多個關聯表
現在,我想要合并三張表,得到新表merge_table,表包含的列一次為:sno,cno,degree,sname,cname。
即,新表中包含score表的所有列,student表的sname列,以及course表的cname列。
1. Excel
為了討論方便,先上結果:
02
首先,在A17:E17單元格創建所需列名,然后通過簡單復制粘貼得到A18:C28這三列的數據。
D、E列的數據可以通過以下兩種方法實現:
使用INDEX()+MATCH()函數;
使用VLOOKUP()函數。
兩種方法實現邏輯和結果都一樣,但前者調用的時候比后者稍復雜。為了說明,D列數據的提取我使用了方法1,E列數據的提取我使用了方法2。
D列:
首先在D18單元格輸入以下函數(函數中的單元格所對應的數據請看圖01)
=INDEX($B$3:$B$8,MATCH(A18,$A$3:$A$8,0))
接著下拉函數至D28。
E列:
在E18單元格輸入以下函數(函數中的單元格所對應的數據請看圖01)
=VLOOKUP(B18,$G$3:$H$6,2,0)
接著下拉函數至E28。
注意,如果要提取某個表中的多個列的數據,比如除了sname,我還想得到ssex、sbirthday和class的數據,由于這些列是一同儲存在student表中的,用VLOOPKUP()顯然更高效。
如果想要加快效率,還可以在原student表上新增一行,用數字x來表示第x列,然后在調用VLOOPKUP()時,直接把第三個參數指向這一行。
2. SQL
在合并關聯表上,SQL非常便捷。實現的語句有兩個(先創建或者導入原數據表):
SELECT score.*, sname, cname FROM score, course, student
WHERE score.sno = student.sno AND score.cno = course.cno;
或
SELECT score.*, sname, cname FROM score
LEFT JOIN student USING(sno)
LEFT JOIN course USING(cno);
兩種方法返回的結果相同,結果如下:
03
我用的MySQL,不知道為什么合并后行的順序變了=。=
3. Python
在Python中,首先導入numpy和pandas模塊:
import numpy as np
import pandas as pd
接著導入數據表。
之后通過以下語句實現merge_table表的建立:
merge_table = pd.merge(score, student[['sno','sname']], on = 'sno', how = 'left')
merge_table = merge_table.merge(course[['cno','cname']], on = 'cno', how = 'left')
結果如下:
04
如果合并的表中數據不匹配怎么辦
現在假設score表多了一行數據:
05
如圖所示,藍色部分為多出的數據,且課程6-106在course表中不存在。請無視邏輯問題,主要是為了方便討論:)
1. Excel
遇到這種情況,上述的實現方法會出現一個問題:
06
因為課程號6-106在course表里并不存在,所以函數在返回值的時候出錯了。
解決的辦法有一個,就是在原函數上嵌套IF()函數。比如我把E29的函數更改為:
=IF(ISERROR(VLOOKUP(B29,$G$3:$H$6,2,0)),0,VLOOKUP(B29,$G$3:$H$6,2,0))
如果函數計算結果錯誤,則返回0。
07
2. SQL
在SQL中,如果出現此類情況,LEFT JOIN會返回NULL值:
08
如果想把NULL值替換為0,查詢合并表的時候可以加上isnull()函數(MySQL中此函數寫作ifnull()):
SELECT score.*, isnull(sname,0), isnull(cname,0) FROM score
LEFT JOIN student USING(sno)
LEFT JOIN course USING(cno);
如果函數計算結果錯誤,則返回0
返回結果和Excel的差不多,就不上圖了。
3. Python
Python中情況類似:
09
如果想把NaN值替換為0,只需要在創建merge_table表之后,添加一行語句:
merge_table = merge_table.fillna(0)
返回結果也不上圖了,和Excel的一樣。
4. PS
面對合并表中數據不匹配,SQL和Python中都可以在合并表的時候把多出項忽略不計,只要把LEFT JOIN換成INNER JOIN就行了。但Excel不能自動刪除多出項所在行。
數據透視表
為了方便,現在做一個透視表,該表返回選了課的同學的學號和其平均課程成績。
三個軟件對于透視表的實現都很友好,并且效率相近。
1. Excel
10
Excel在數據透視表工具下把列各種拖拽就行了。
另外,Excel的數據透視表可以選擇返回合計(Grand Total)或者不返回。
2. SQL
語句:
SELECT sno, ROUND(AVG(degree),2) AS 'mean' FROM score
GROUP BY sno;
結果:
11
3. Python
語句:
score.groupby(['sno'])['degree'].agg(['mean']).reset_index()
結果:
12
一般做透視表的最終目的是作圖,畢竟一圖勝千語。
從這個目的出發,Python比SQL、Excel更實用,一來Python比Excel作圖高效很多,二來SQL不能作圖。
總結
通過上述對比可以發現,Excel合并關聯表比SQL、Python要低效得多,而且在“數據不匹配”問題上解決得不好;而在另一方面,三者在創建透視表上表現相似,就看你習慣用哪個了:)
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的sql和python的区别_数据处理简单对比:Excel,SQL,Python的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑重启后python导入的库不见_为什
- 下一篇: linux vnc的小黑点和鼠标不同步_