從 SQL 到 Pandas — Select/ Distinct/ Where

Nancy SW
5 min readMar 1, 2020

--

前言

Pandas、Numpy 是 Python 的函式庫(library),他們提供了許多比 SQL 更強大、更便利的工具來進行資料處理,若是對 SQL 稍有概念,Pandas 也就不難上手。這一系列文章要分享的是從 SQL 轉移到 Pandas 時,相對應的語法使用方式。

以下會使用 Google Colab 作為練習環境,進去以後點選左上角的 File > New Notebook 就可以開始練習了。一開始要先匯入這兩個函式庫,並建一個隨機的 DataFrame 作為待會練習的範例。

import pandas as pd
import numpy as np
df = pd.util.testing.makeMixedDataFrame() # 隨機生成DataFrame

#1 — SELECT

這是 SQL 中最基本的語法架構,意思是從這張表格(table_name)中,取出三個欄位(column1, column2, column3)。

SELECT column1, column2, column3
FROM table_name

在 Pandas 中,假設我們想從上面隨機生成的 DataFrame 裡取出 A、C 兩個欄位,使用下列語法就可以輕鬆完成:

df = pd.util.testing.makeMixedDataFrame()
df[['A', 'C']] # 列出要選出的欄位

#2 — WHERE

如果希望篩選出的資料要符合特定條件,在 SQL 中應使用以下語法,意思是從這張表格(table_name)中,取出三個欄位(column1, column2, column3),且篩選出的資料應符合兩個條件(condition1, condition2)。

SELECT column1, column2, column3
FROM table_name
WHERE condition1
AND condition2

在 Pandas 中要篩選資料,則有幾種不同的方法:

  1. >, <, ==, !=
df[df['B'] == 1.0]                 # 選出B欄位為1.0的資料
df[df['C'] == "foo4"] # 選出C欄位為foo4的資料
df[df['D'] >= "2009-01-05"] # 選出D欄位日期在2009/1/5以後的資料
B欄位為1.0的資料結果

2. isin()

df[df['C'].isin(["foo2","foo3","foo4"])]        # 選出C欄位為所列的資料
C欄位為foo2, foo3, foo4的資料結果

3. between()

df[df["D"].between("2009-01-03","2009-01-06")]  # 選出日期在範圍內的資料
df[df['A'].between(1.0,3.0)] # 選出A欄位數值介於1.0-3.0的資料
A欄位數值介於1.0–3.0的資料結果

如果同時有兩個以上的條件需要滿足,可以利用以下寫法推廣:

cond1 = df['A'] >= 2.0                               # 一:A > 2.0
cond2 = df['D'].between("2009-01-03","2009-01-06") # 二:日期符合區間
df[(cond1 & cond2)] # 應同時滿足條件一與條件二
同時滿足條件一與條件二的資料

#3 — DISTINCT

在 SQL 中,DISTINCT 的用法是列出一個或多個欄位裡共有幾種不重複的資料,如果以上面的 DataFrame 為例, Column B 裡共有兩種不同的資料:0.0 和 1.0,可以透過以下語法來確認:

SELECT DISTINCT B
FROM df

在 Pandas 裡則是使用 unique() 函式:

df['B'].unique()

這個功能除了用來排除重複性資料,也可以用來確認欄位中的資料樣貌、或快速檢查不需要的資料是否已經篩選乾淨,尤其當資料本身很大量時,直接用 DISTINCT 列出資料種類是最方便的方法。

以上表為例,假設我們想知道 job 共分成哪幾種,可以用 unique() 取得:

如果想進一步算出該欄位的資料種類,各有多少筆不重複資料,可以使用 value_counts() 函數處理:

--

--