Pandas與SQL的查詢語句對比

Pandas中的查詢功能

以知乎猴子社群的數(shù)據(jù)為例進行演示:

import pandas as pd
df = pd.read_excel('cyyy2016.xlsx')
df.head(10)

購藥時間    社保卡號    商品編碼    商品名稱    銷售數(shù)量    應收金額    實收金額
0   2016-01-01 星期五  1616528 236701  三九感冒靈   7   196.0   182.00
1   2016-01-02 星期六  1616528 236701  三九感冒靈   3   84.0    84.00
2   2016-01-06 星期三  10070343428 236701  三九感冒靈   3   84.0    73.92
3   2016-01-11 星期一  13389528    236701  三九感冒靈   1   28.0    28.00
4   2016-01-15 星期五  101554328   236701  三九感冒靈   8   224.0   208.00
5   2016-01-20 星期三  13389528    236701  三九感冒靈   1   28.0    28.00
6   2016-01-31 星期日  101464928   236701  三九感冒靈   2   56.0    56.00
7   2016-02-17 星期三  11177328    236701  三九感冒靈   5   149.0   131.12
8   2016-02-22 星期一  10065687828 236701  三九感冒靈   1   29.8    26.22
9   2016-02-24 星期三  12602828    236701  三九感冒靈   4   119.2   104.89

所有操作均在Jupyter Notebook中進行

1. SELECT

從中選擇“商品名稱”,“銷售數(shù)量”兩列

SQL:

SELECT "商品名稱","銷售數(shù)量"
FROM cyyy
LIMIT 5

PANDAS:

df[['商品名稱','銷售數(shù)量']].head(5)

商品名稱    銷售數(shù)量
0   三九感冒靈   7
1   三九感冒靈   3
2   三九感冒靈   3
3   三九感冒靈   1
4   三九感冒靈   8

2. WHERE

從中篩選出銷售數(shù)量為3件的銷售記錄
SQL:

SELECT * 
FROM cyyy
WHERE "銷售數(shù)量" = 3
LIMIT 5

PANDAS:

df[df['銷售數(shù)量']==3].head(5)

購藥時間    社保卡號    商品編碼    商品名稱    銷售數(shù)量    應收金額    實收金額
1   2016-01-02 星期六  1616528 236701  三九感冒靈   3   84.0    84.00
2   2016-01-06 星期三  10070343428 236701  三九感冒靈   3   84.0    73.92
76  2016-06-05 星期日  10024054228 236703  三九感冒靈   3   89.4    78.67
78  2016-01-12 星期二  11487628    236704  感康  3   25.2    22.50
80  2016-01-27 星期三  11487628    236704  感康  3   25.2    22.50

在這個過程中,表達式df["銷售數(shù)量"] == 3 會返回一個包含True/False的Series對象:

df['銷售數(shù)量']==3
0       False
1        True
2        True
3       False
4       False
5       False
6       False
7       False
8       False
9       False
10      False

將表達式傳入df之后會返回值為True的行

s = df['銷售數(shù)量'] == 3
df[s].head(5)

購藥時間    社??ㄌ?   商品編碼    商品名稱    銷售數(shù)量    應收金額    實收金額
1   2016-01-02 星期六  1616528 236701  三九感冒靈   3   84.0    84.00
2   2016-01-06 星期三  10070343428 236701  三九感冒靈   3   84.0    73.92
76  2016-06-05 星期日  10024054228 236703  三九感冒靈   3   89.4    78.67
78  2016-01-12 星期二  11487628    236704  感康  3   25.2    22.50
80  2016-01-27 星期三  11487628    236704  感康  3   25.2    22.50

類似于SQL中的OR、AND語句,pandas也可以設置多重篩選條件

df[(df['商品名稱']=='感康')&(df['銷售數(shù)量']==4)].head(5)

購藥時間    社??ㄌ?   商品編碼    商品名稱    銷售數(shù)量    應收金額    實收金額
82  2016-02-25 星期四  103935028   236704  感康  4   33.6    29.56
89  2016-04-24 星期日  10014223328 236704  感康  4   33.6    30.00
135 2016-07-05 星期二  10030914028 861368  感康  4   38.0    33.44
4490    2016-04-25 星期一  10030914028 872293  感康  4   91.2    80.26
5175    2016-05-05 星期四  10030914028 872293  感康  4   91.2    80.26

3. GROUP BY

在Pandas中可以使用groupby()函數(shù)實現(xiàn)類似于SQL中的GROUP BY功能,groupby()能將數(shù)據(jù)集按某一條件分為多個組,然后對其進行某種函數(shù)運算(通常是聚合運算)。
如統(tǒng)計每種藥品的銷售記錄數(shù)量
SQL:

SELECT 商品名稱,count(*)
FROM cyyy
GROUP BY 商品名稱

PANDAS:

df.groupby('商品名稱').size().head(5)
商品名稱
**鹽酸阿羅洛爾片(阿爾馬爾)    34
**阿替洛爾片             8
D厄貝沙坦氫氯噻嗪片(倍悅)      1
D替格瑞洛片              1
D鹽酸貝尼地平片            3
dtype: int64

這里也可以使用count(),與size()不同的是,count會統(tǒng)計各列的非NaN項數(shù)量

df.groupby('商品名稱').count().head(5)
    購藥時間    社??ㄌ?   商品編碼    銷售數(shù)量    應收金額    實收金額
商品名稱                        
**鹽酸阿羅洛爾片(阿爾馬爾) 34  34  34  34  34  34
**阿替洛爾片 8   8   8   8   8   8
D厄貝沙坦氫氯噻嗪片(倍悅)  1   1   1   1   1   1
D替格瑞洛片  1   1   1   1   1   1
D鹽酸貝尼地平片    3   3   3   3   3   3
df.groupby('商品名稱')['社保卡號'].count().head(5)
商品名稱
**鹽酸阿羅洛爾片(阿爾馬爾)    34
**阿替洛爾片             8
D厄貝沙坦氫氯噻嗪片(倍悅)      1
D替格瑞洛片              1
D鹽酸貝尼地平片            3
Name: 社??ㄌ? dtype: int64

groupby()還可以分別對各列應用不同的函數(shù)
SQL:

SELECT 商品名稱,AVG(銷售數(shù)量),COUNT(*)
FROM cyyy
GROUP BY 商品名稱

PANDAS:

import numpy as np
df.groupby('商品名稱').agg({'銷售數(shù)量':np.mean,'應收金額':np.size}).head(5)


  銷售數(shù)量  應收金額
商品名稱        
**鹽酸阿羅洛爾片(阿爾馬爾) 2.970588    34.0
**阿替洛爾片 2.125000    8.0
D厄貝沙坦氫氯噻嗪片(倍悅)  2.000000    1.0
D替格瑞洛片  10.000000   1.0
D鹽酸貝尼地平片    11.000000   3.0

同樣也可以按照多個條件進行GROUPBY
SQL:

SELECT 商品名稱,銷售數(shù)量,COUNT(*),AVG(應收金額)
FROM cyyy
GROUP BY 商品名稱,銷售數(shù)量

PANDAS:

df.groupby(['商品名稱','銷售數(shù)量']).agg({'應收金額':[np.size,np.mean]})


    應收金額
    size    mean
商品名稱    銷售數(shù)量        
**鹽酸阿羅洛爾片(阿爾馬爾) 1   16.0    40.000000
2   9.0 80.000000
3   1.0 120.000000
4   1.0 160.000000
5   4.0 200.000000
11  1.0 440.000000
14  1.0 560.000000
15  1.0 600.000000
**阿替洛爾片 1   3.0 4.500000
2   3.0 9.000000
3   1.0 13.500000
5   1.0 22.500000
D厄貝沙坦氫氯噻嗪片(倍悅)  2   1.0 132.200000
D替格瑞洛片  10  1.0 2500.000000
D鹽酸貝尼地平片    5   1.0 170.500000
8   1.0 272.800000
20  1.0 682.000000
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容