介紹
SQL 是用於訪問和處理資料庫的標準的計算機語言。 常用於資料庫管理系統(RDBMS)中, 這類資料庫包括 MySQL、SQL Server、Oracle等。
Pandas 是一個開源的,為 Python 提供高效能的,資料結構以及資料分析工具。
在熟練地使用 SQL 的同時,為滿足一些的業務需求,常常需要我們將資料提取後,再對資料進行統計分析,那應該如何使用 Pandas 達到和 SQL 一樣的效果呢?
下面的速查表將會逐一使用 Pandas 對常見的 SQL 語句進行對映。
本篇內容
本篇將解構下面的 SQL 查詢句式, 使用 Pandas 進行實現
SQL 查詢句式
SELECT DISTINCT [欄位]
FROM [表] JOIN [bin] ON [連線條件]
WHERE [過濾條件]
GROUP BY [欄位]
HAVING [條件]
ORDER BY [欄位] DESC
LIMIT [個數] OFFSET [個數]
複製程式碼
讀取測試資料
import pandas as pd
import pymysql
複製程式碼
conn = pymysql.connect(host='127.0.0.1',
user='root',
password='12345678',
db='test_db')
df = pd.read_sql(sql="select * from student", con=conn)
複製程式碼
資料預覽
df
複製程式碼
id | name | age | sex | city | money | |
---|---|---|---|---|---|---|
0 | 1 | 趙雷 | 1990-01-01 | 男 | 北京 | 20.0 |
1 | 2 | 錢電 | 1990-12-21 | 男 | 天津 | 30.0 |
2 | 3 | 孫風 | 1990-12-20 | 男 | 成都 | 2.0 |
3 | 4 | 李雲 | 1990-12-06 | 男 | 北京 | 100.0 |
4 | 5 | 周梅 | 1991-12-01 | 女 | 成都 | 50.0 |
5 | 6 | 吳蘭 | 1992-01-01 | 女 | 北京 | 3.0 |
6 | 7 | 鄭竹 | 1989-01-01 | 女 | 成都 | 200.0 |
7 | 8 | 張三 | 2017-12-20 | 女 | 天津 | 20.0 |
8 | 9 | 李四 | 2017-12-25 | 女 | 西安 | 35.0 |
9 | 10 | 李四 | 2012-06-06 | 女 | 北京 | 40.0 |
10 | 11 | 趙六 | 2013-06-13 | 女 | 成都 | 5.0 |
11 | 12 | 孫七 | 2014-06-01 | 女 | 天津 | 210.0 |
SELECT
SQL
SELECT * FROM student
SELECT id, name, sex FROM student
複製程式碼
Pandas
df
df[['id','name','sex']]
複製程式碼
DISTINCT
SQL
SELECT DISTINCT name FROM student
複製程式碼
Pandas
df['name'].unique()
複製程式碼
COUNT & SUM & MAX & MIN & AVG
SQL
SELECT COUNT(*) FROM student
SELECT SUM(money) FROM student
SELECT id, MAX(money) FROM student
SELECT id, MIN(money) FROM student
SELECT AVG(money) FROM student
複製程式碼
Pandas
df['id'].count()
df['money'].sum()
df[df['money'] == df['money'].max()]
df[df['money'] == df['money'].min()]
df['money'].mean()
複製程式碼
描述性統計資料
In [1]: df['money'].describe()
Out[1]: count 12.000000
mean 59.583333
std 72.963825
min 2.000000
25% 16.250000
50% 32.500000
75% 62.500000
max 210.000000
Name: money, dtype: float64
複製程式碼
WHERE
例子: =
SQL
SELECT * FROM student WHERE sex = '男'
複製程式碼
Pandas
df[df['sex'] == ('男')]
複製程式碼
例子: in & not in
SQL
SELECT * FROM student WHERE id IN (2,4,6,8,10)
SELECT * FROM student WHERE id NOT IN (2,4,6,8,10)
複製程式碼
Pandas
df[df['id'].isin((2,4,6,8))]
df[~df['id'].isin((2,4,6,8))]
複製程式碼
多個條件
SQL
SELECT * FROM student WHERE sex = '男' and id IN (2,4,6,8,10)
複製程式碼
Pandas
df[(df['sex'] == ('男')) & (df['id'].isin((2,4,6,8)))]
複製程式碼
LIMIT OFFSET
SQL
SELECT * FROM student ORDER BY id DESC LIMIT 3
SELECT * FROM student ORDER BY id DESC LIMIT 3 OFFSET 2
複製程式碼
Pandas
df.sort_values('id',ascending=False).head(3)
df.nlargest(2 + 3, 'id').tail(3)
複製程式碼
SELECT & WHERE & LIMIT
SQL
SELECT * FROM student WHERE sex = '男' LIMIT 3
SELECT id, name, sex FROM student WHERE sex ='男' LIMIT 3
複製程式碼
Pandas
df[df['sex'] == ('男')].head(3)
df[df['sex'] == ('男')][['id','name','sex']].head(3)
複製程式碼
ORDER BY
SQL
SELECT * FROM student ORDER BY age
SELECT * FROM student ORDER BY age DESC
複製程式碼
Pandas
df.sort_values('age')
df.sort_values('age', ascending=False)
複製程式碼
GROUP BY
GROYP BY & COUNT
SQL
SELECT city, COUNT(*) FROM student GROUP BY city
複製程式碼
Pandas
df.groupby(['city']).size().to_frame('size').reset_index()
複製程式碼
GROYP BY & SUM
SQL
SELECT city, SUM(money) FROM student GROUP BY city
複製程式碼
Pandas
df.groupby(['city'])['money'].agg('sum').reset_index()
複製程式碼
GROUP BY & ORDER BY & COUNT
GROUP BY 單欄位
SQL
SELECT city, COUNT(*) FROM student GROUP BY sex ORDER BY city
複製程式碼
Pandas
df.groupby(['city']).size().to_frame('size').reset_index().sort_values('city')
複製程式碼
GROUP BY 多欄位
SQL
SELECT city, sex, COUNT(*) FROM student GROUP BY city, sex ORDER BY city
複製程式碼
Pandas
df.groupby(['city','sex']).size().to_frame('size').reset_index().sort_values('city')
複製程式碼
HAVING
SQL
SELECT city, COUNT(*) FROM student GROUP BY city HAVING count(*) > 3
複製程式碼
Pandas
df.groupby('city').filter(lambda x:len(x)>3).groupby('city').size().to_frame('size').reset_index()
複製程式碼
系列文章