Python Pandas - 與SQL的比較



Pandas 是一個強大的 Python 庫,用於資料操作和分析,廣泛應用於資料科學和工程領域。許多潛在的 Pandas 使用者都來自 SQL 背景,SQL 是一種用於管理和查詢關係資料庫的語言。瞭解如何使用 Pandas 執行類似 SQL 的操作可以顯著簡化轉換過程並提高生產力。

本教程並排比較了常見的 SQL 操作及其在 Pandas 中的等效操作,使用流行的“tips”資料集。

匯入必要的庫

在深入比較之前,讓我們首先匯入必要的庫。

import pandas as pd
import numpy as np

我們還將載入 "tips" 資料集,本教程將始終使用該資料集。

import pandas as pd
url = 'https://raw.githubusercontent.com/pandas-dev/pandas/main/pandas/tests/io/data/csv/tips.csv'

tips=pd.read_csv(url)
print(tips.head())

輸出如下:

    total_bill   tip      sex  smoker  day     time  size
0        16.99  1.01   Female      No  Sun  Dinner      2
1        10.34  1.66     Male      No  Sun  Dinner      3
2        21.01  3.50     Male      No  Sun  Dinner      3
3        23.68  3.31     Male      No  Sun  Dinner      2
4        24.59  3.61   Female      No  Sun  Dinner      4

選擇列

在 SQL 中,SELECT 語句用於從表中檢索特定列。選擇是使用您選擇的列的逗號分隔列表(或選擇所有列的 *)進行的:

SELECT total_bill, tip, smoker, time
FROM tips
LIMIT 5;

在 Pandas 中,您可以透過使用列名列表從 DataFrame 中選擇列來獲得相同的結果:

tips[['total_bill', 'tip', 'smoker', 'time']].head(5)

示例

讓我們檢查一下顯示所選列前五行的完整程式:

import pandas as pd
url = 'https://raw.githubusercontent.com/pandas-dev/pandas/main/pandas/tests/io/data/csv/tips.csv'
 
tips=pd.read_csv(url)
print(tips[['total_bill', 'tip', 'smoker', 'time']].head(5))

輸出如下:

   total_bill   tip  smoker     time
0       16.99  1.01      No   Dinner
1       10.34  1.66      No   Dinner
2       21.01  3.50      No   Dinner
3       23.68  3.31      No   Dinner
4       24.59  3.61      No   Dinner

不使用列名列表呼叫 DataFrame 將顯示所有列(類似於 SQL 的 *)。

過濾行

在 SQL 中,WHERE 子句用於根據特定條件過濾記錄。

SELECT * FROM tips WHERE time = 'Dinner' LIMIT 5;

DataFrame 可以透過多種方式進行過濾;其中最直觀的是使用布林索引。

tips[tips['time'] == 'Dinner'].head(5)

示例

讓我們檢查一下顯示時間等於“Dinner”的前五條記錄的完整程式:

import pandas as pd
url = 'https://raw.githubusercontent.com/pandas-dev/pandas/main/pandas/tests/io/data/csv/tips.csv'

tips=pd.read_csv(url)
print(tips[tips['time'] == 'Dinner'].head(5))

輸出如下:

   total_bill   tip      sex  smoker  day    time  size
0       16.99  1.01   Female     No   Sun  Dinner    2
1       10.34  1.66     Male     No   Sun  Dinner    3
2       21.01  3.50     Male     No   Sun  Dinner    3
3       23.68  3.31     Male     No   Sun  Dinner    2
4       24.59  3.61   Female     No   Sun  Dinner    4

上面的語句將 True/False 物件的 Series 傳遞給 DataFrame,返回所有值為 True 的行。

分組資料

SQL 的GROUP BY 子句用於對指定列中具有相同值的行進行分組,並對它們執行聚合函式。例如,要計算每種性別留下的消費小費數量:

SELECT sex, count(*)
FROM tips
GROUP BY sex;

在 Pandas 中,groupby() 方法用於獲得相同的結果:

tips.groupby('sex').size()

示例

讓我們檢查一下顯示按性別分組的小費數量的完整程式:

import pandas as pd

url = 'https://raw.githubusercontent.com/pandas-dev/pandas/main/pandas/tests/io/data/csv/tips.csv'

tips=pd.read_csv(url)
print(tips.groupby('sex').size())

輸出如下:

sex
Female   87
Male    157
dtype: int64

限制行數

在 SQL 中,LIMIT 子句用於限制查詢返回的行數。例如:

SELECT * FROM tips
LIMIT 5 ;

在 Pandas 中,head() 方法用於實現此目的:

tips.head(5)

示例

讓我們檢查一下顯示 DataFrame 前五行的完整示例:

import pandas as pd

url = 'https://raw.githubusercontent.com/pandas-dev/pandas/main/pandas/tests/io/data/csv/tips.csv'

tips=pd.read_csv(url)
tips = tips[['smoker', 'day', 'time']].head(5)
print(tips)

輸出如下:

   smoker   day     time
0      No   Sun   Dinner
1      No   Sun   Dinner
2      No   Sun   Dinner
3      No   Sun   Dinner
4      No   Sun   Dinner

這些是我們之前章節中學習的 Pandas 庫中比較的一些基本操作。

廣告