日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

sql和python的区别_数据处理简单对比:Excel,SQL,Python

發布時間:2025/3/15 python 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。