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