自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Python Pandas可以像SQL那樣,進行數(shù)據(jù)篩選統(tǒng)計

大數(shù)據(jù) 后端
本文通過Pandas實現(xiàn)SQL語法中條件過濾、排序、關(guān)聯(lián)、合并、更新、刪除等簡單及復(fù)雜操作,使得我們對方法的理解更加深刻,更加得心應(yīng)手。

相對于學(xué)習(xí)Pandas各種數(shù)據(jù)篩選操作,SQL語法顯得更加簡潔清晰,若能夠?qū)QL語法與Pandas中對應(yīng)的函數(shù)的使用方法關(guān)聯(lián)起來,對于我們應(yīng)用Pandas進行數(shù)據(jù)篩選來講無疑是一個福音。

本文通過Pandas實現(xiàn)SQL語法中條件過濾、排序、關(guān)聯(lián)、合并、更新、刪除等簡單及復(fù)雜操作,使得我們對方法的理解更加深刻,更加得心應(yīng)手。

演示數(shù)據(jù)集

本文采用安德森鳶尾花卉(iris)數(shù)據(jù)集進行演示,iris數(shù)據(jù)集包含150個樣本,對應(yīng)數(shù)據(jù)集的每行數(shù)據(jù)。每行數(shù)據(jù)包含每個樣本的四個特征和樣本的類別信息,因此iris數(shù)據(jù)集是一個150行*5列的二維表。

我們可以 UCI Iris dataset 獲取或者使用 from sklearn.datasets import load_iris 方式獲取,為了演示方便我們只取其中10行數(shù)據(jù),如下: 

Python Pandas可以像SQL那樣,進行數(shù)據(jù)篩選統(tǒng)計

接下來,就讓我們一起學(xué)習(xí)一下,如何Pandas實現(xiàn)SQL語法中條件過濾、排序、關(guān)聯(lián)、合并、更新、刪除等數(shù)據(jù)查詢操作。

字段查詢 SELECT

  1. SELECT sl, sw, pl, pw FROM iris LIMIT 2; 

如上SQL實現(xiàn)返回每行記錄的 sl,sw,pl,pw 字段,僅返回2行記錄。我們使用Pandas實現(xiàn)如上SQL的功能,代碼如下: 

  1. import pandas as pd 
  2.  
  3. iris = pd.read_excel(io="iris.xlsx"
  4.               sheet_name='iris'
  5.               usecols=["sl""sw""pl""pw""classes"]) 
  6.  
  7. search = iris[["sl""sw""pl""pw"]].head(2) 
  8. print(search) 
  9.  
  10. # 執(zhí)行上述代碼,輸出結(jié)果為: 
  11.     sl   sw   pl   pw 
  12. 0  5.1  3.5  1.4  0.2 
  13. 1  4.9  3.0  1.4  0.2 

簡單的條件過濾查詢 WHERE

  1. SELECT * FROM iris WHERE classes = 1 LIMIT 2; 

如上SQL實現(xiàn)了查詢滿足classes=1的記錄,并返回2行。我們使用Pandas實現(xiàn)該SQL,代碼如下: 

  1. import pandas as pd 
  2.  
  3. iris = pd.read_excel(io="iris.xlsx"
  4.               sheet_name='iris'
  5.               usecols=["sl""sw""pl""pw""classes"]) 
  6.  
  7. search = iris[iris["classes"]==1].head(2) 
  8. print(search) 
  9.  
  10. # 執(zhí)行上述代碼,輸出結(jié)果為: 
  11.     sl   sw   pl   pw  classes 
  12. 3  6.8  2.8  4.8  1.4        1 
  13. 4  6.7  3.0  5.0  1.7        1 

多條件的與或過濾查詢 WHERE AND|OR

與關(guān)系 &

  1. SELECT * FROM iris WHERE classes = 1 AND pl >= 5 LIMIT 2; 

如上SQL實現(xiàn)查詢同時滿足classes=1 和 pl >=5 兩個條件的記錄,并返回2行。我們使用Pandas實現(xiàn)該SQL,代碼如下: 

  1. import pandas as pd 
  2.  
  3. iris = pd.read_excel(io="iris.xlsx"
  4.                      sheet_name='iris'
  5.                      usecols=["sl""sw""pl""pw""classes"]) 
  6.  
  7. search = iris[ 
  8.     (iris["classes"] == 1) & 
  9.               (iris["pl"] >= 5) 
  10.               ].head(2) 
  11. print(search) 
  12.  
  13. # 執(zhí)行上述代碼,輸出結(jié)果為: 
  14.     sl   sw   pl   pw  classes 
  15. 4  6.7  3.0  5.0  1.7        1 

或關(guān)系 |

  1. SELECT * FROM iris WHERE sl >= 5 OR pl >=5 LIMIT 2; 

如上SQL實現(xiàn)查詢滿足 sl >=5 或者 pl >=5 任一條件的記錄,返回2行。我們使用Pandas實現(xiàn)該SQL,代碼如下: 

  1. import pandas as pd 
  2.  
  3. iris = pd.read_excel(io="iris.xlsx"
  4.                      sheet_name='iris'
  5.                      usecols=["sl""sw""pl""pw""classes"]) 
  6.  
  7. search = iris[ 
  8.     (iris["sl"] >= 5) | 
  9.               (iris["pl"] >= 5) 
  10.               ].head(2) 
  11. print(search) 
  12.  
  13. # 執(zhí)行上述代碼,輸出結(jié)果為: 
  14.     sl   sw   pl   pw  classes 
  15. 0  5.1  3.5  1.4  0.2        0 
  16. 2  5.4  3.9  1.7  0.4        0 

條件過濾 空值判斷

空判斷 is null

  1. SELECT * FROM iris WHERE sl IS NULL

如上SQL實現(xiàn)查詢 sl 字段為NULL的記錄,我們使用Pandas實現(xiàn)該SQL,代碼如下: 

  1. import pandas as pd 
  2.  
  3. iris = pd.read_excel(io="iris.xlsx"
  4.                      sheet_name='iris'
  5.                      usecols=["sl""sw""pl""pw""classes"]) 
  6.  
  7. search = iris[iris["sl"].isna()] 
  8. print(search) 

非空判斷 is not null

  1. SELECT * FROM iris WHERE sl IS NOT NULL

如上SQL實現(xiàn)查詢sl字段不為 NULL 的記錄。我們使用Pandas實現(xiàn)該SQL,代碼如下: 

  1. import pandas as pd 
  2.  
  3. iris = pd.read_excel(io="iris.xlsx"
  4.                      sheet_name='iris'
  5.                      usecols=["sl""sw""pl""pw""classes"]) 
  6.  
  7. search = iris[iris["sl"].notna()] 
  8. print(search) 
  9.  
  10. # 執(zhí)行上述代碼,輸出結(jié)果為: 
  11.     sl   sw   pl   pw  classes 
  12. 0  5.1  3.5  1.4  0.2        0 
  13. 1  4.9  3.0  1.4  0.2        0 
  14. 2  5.4  3.9  1.7  0.4        0 
  15. 3  6.8  2.8  4.8  1.4        1 
  16. 4  6.7  3.0  5.0  1.7        1 
  17. 5  6.0  2.9  4.5  1.5        1 
  18. 6  5.6  2.8  4.9  2.0        2 
  19. 7  7.7  2.8  6.7  2.0        2 
  20. 8  6.3  2.7  4.9  1.8        2 
  21. 9  6.7  3.3  5.7  2.1        2 

排序 ORDER BY ASC|DESC

  1. SELECT * FROM iris WHERE sl >= 6 ORDER BY DESC classes; 

如上SQL實現(xiàn)將滿足sl字段值大于等于5的記錄,按照classes降序排序。我們使用Pandas實現(xiàn)該SQL,代碼如下: 

  1. import pandas as pd 
  2.  
  3. iris = pd.read_excel(io="iris.xlsx"
  4.                      sheet_name='iris'
  5.                      usecols=["sl""sw""pl""pw""classes"]) 
  6.  
  7. search = iris[(iris["sl"] >= 6)].sort_values( 
  8.                                  by="classes", ascending=False
  9. print(search) 
  10.  
  11. # 執(zhí)行上述代碼,輸出結(jié)果為: 
  12.     sl   sw   pl   pw  classes 
  13. 7  7.7  2.8  6.7  2.0        2 
  14. 8  6.3  2.7  4.9  1.8        2 
  15. 9  6.7  3.3  5.7  2.1        2 
  16. 3  6.8  2.8  4.8  1.4        1 
  17. 4  6.7  3.0  5.0  1.7        1 
  18. 5  6.0  2.9  4.5  1.5        1 

更新 UPDATE

  1. UPDATE iris SET classes = 2 WHERE pw = 1.7 AND pl >= 5; 

如上SQL實現(xiàn)將同時滿足pw = 1.7 和 pl >= 5的記錄中的classes字段值更新為2。我們使用Pandas實現(xiàn)該SQL,代碼如下: 

  1. import pandas as pd 
  2.  
  3. iris = pd.read_excel(io="iris.xlsx"
  4.                      sheet_name='iris'
  5.                      usecols=["sl""sw""pl""pw""classes"]) 
  6.  
  7. iris.loc[(iris["pw"] == 1.7) & (iris["pl"] >= 5), "classes"] = 2 
  8.  
  9. print(iris[iris["pw"] == 1.7]) 
  10.  
  11. # 執(zhí)行上述代碼,輸出結(jié)果為: 
  12.     sl   sw   pl   pw  classes 
  13. 4  6.7  3.0  5.0  1.7        2 

分組統(tǒng)計 GROUP BY

  1. SELECT classes, COUNT(*) FROM iris GROUP BY classes; 

如上SQL實現(xiàn) 根據(jù)classes進行分組,返回classes 及每組數(shù)量。我們使用Pandas實現(xiàn)該SQL,代碼如下: 

  1. import pandas as pd 
  2.  
  3. iris = pd.read_excel(io="iris.xlsx"
  4.                      sheet_name='iris'
  5.                      usecols=["sl""sw""pl""pw""classes"]) 
  6.  
  7. count = iris.groupby("classes").size() 
  8.  
  9. print(count
  10.  
  11. # 執(zhí)行上述代碼,輸出結(jié)果為: 
  12. classes 
  13. 0    3 
  14. 1    3 
  15. 2    4 
  16. dtype: int64 

分組統(tǒng)計 聚合輸出

  1. SELECT classes, avg(pl), max(sl) FROM iris GROUP BY classes; 

如何SQL實現(xiàn)根據(jù)classes進行分組,返回classes值,每個分組的pl平均值以及每個分組的sl最大值。我們使用Pandas實現(xiàn)該SQL,代碼如下: 

  1. import pandas as pd 
  2. import numpy as np 
  3. iris = pd.read_excel(io="iris.xlsx"
  4.                      sheet_name='iris'
  5.                      usecols=["sl""sw""pl""pw""classes"]) 
  6.  
  7. search = iris.groupby("classes").agg( 
  8.                                 {"sl":np.max"pl":np.mean}) 
  9.  
  10. print(search) 
  11.  
  12. # 執(zhí)行上述代碼,輸出結(jié)果為: 
  13.           sl        pl 
  14. classes                
  15. 0        5.4  1.500000 
  16. 1        6.8  4.766667 
  17. 2        7.7  5.550000 

刪除

  1. DELETE FROM iris WHERE pw = 1.7 AND pl >=5; 

如上SQL實現(xiàn)將同時滿足pw = 1.7 和 pl >= 5的記錄刪除。我們使用Pandas實現(xiàn)該SQL,代碼如下: 

  1. import pandas as pd 
  2.  
  3. iris = pd.read_excel(io="iris.xlsx"
  4.                      sheet_name='iris'
  5.                      usecols=["sl""sw""pl""pw""classes"]) 
  6.  
  7. drop = iris.drop(iris[(iris["pw"] == 1.7) & 
  8.                        (iris["pl"] >= 5)].index
  9.  
  10. print(drop[drop["pw"] > 1.6]) 
  11.  
  12. # 執(zhí)行上述代碼,輸出結(jié)果為: 
  13.     sl   sw   pl   pw  classes 
  14. 6  5.6  2.8  4.9  2.0        2 
  15. 7  7.7  2.8  6.7  2.0        2 
  16. 8  6.3  2.7  4.9  1.8        2 
  17. 9  6.7  3.3  5.7  2.1        2 

UNION & JOIN 演示數(shù)據(jù)集

接下來介紹如何使用Pandas進行合并查詢及多表關(guān)聯(lián)查詢,為了演示方便,我們上面示例中的iris數(shù)據(jù)集,拆分成iris_a,iris_b兩部分,如下: 

Python Pandas可以像SQL那樣,進行數(shù)據(jù)篩選統(tǒng)計

UNION 合并查詢

合并結(jié)果 UNION ALL 可能存在重復(fù)記錄

合并如下兩個 SELECT 語句的結(jié)果集,需注意,UNION ALL 內(nèi)部的 SELECT 語句必須擁有相同數(shù)量的列,列也必須擁有相似的數(shù)據(jù)類型。同時,每條 SELECT 語句中的列的順序必須相同。 

  1. SELECT * FROM iris_a WHERE classes = 1 
  2. UNION ALL 
  3. SELECT * FROM iris_b WHERE classes = 1 ; 

如上SQL實現(xiàn)將兩個查詢結(jié)果進行合并,允許存在重復(fù)記錄。我們使用 pandas.concat 方法實現(xiàn)該SQL,代碼如下: 

  1. import pandas as pd 
  2.  
  3. iris_a = pd.read_excel(io="iris.xlsx"
  4.                      sheet_name='iris_a'
  5.                      usecols=["sl""sw""pl""pw""classes"]) 
  6.  
  7. iris_b = pd.read_excel(io="iris.xlsx"
  8.                      sheet_name='iris_b'
  9.                      usecols=["sl""sw""pl""pw""classes"]) 
  10.  
  11. data = pd.concat( 
  12.     [iris_a[iris_a["classes"] == 1], iris_b[iris_b["classes"] == 1]]) 
  13.  
  14. print(data) 
  15.  
  16. # 執(zhí)行上述代碼,輸出結(jié)果為: 
  17.     sl   sw   pl   pw  classes 
  18. 3  6.8  2.8  4.8  1.4        1 
  19. 4  6.7  3.0  5.0  1.7        1 
  20. 0  6.7  3.0  5.0  1.7        1 
  21. 1  6.0  2.9  4.5  1.5        1 

合并結(jié)果 UNION 不存在重復(fù)記錄

合并如下兩個 SELECT 語句的結(jié)果集,同時也需注意,UNION 內(nèi)部的 SELECT 語句必須擁有相同數(shù)量的列,列也必須擁有相似的數(shù)據(jù)類型。同時,每條 SELECT 語句中的列的順序必須相同。 

  1. SELECT * FROM iris_a WHERE classes = 1 
  2. UNION 
  3. SELECT * FROM iris_b WHERE classes = 1 ; 

如上SQL實現(xiàn)將兩個select查詢結(jié)果進行合并,不允許存在重復(fù)記錄。我們使用 pandas.concat.drop_duplicates 方法 實現(xiàn)該SQL,代碼如下: 

  1. import pandas as pd 
  2.  
  3. iris_a = pd.read_excel(io="iris.xlsx"
  4.                      sheet_name='iris_a'
  5.                      usecols=["sl""sw""pl""pw""classes"]) 
  6.  
  7. iris_b = pd.read_excel(io="iris.xlsx"
  8.                      sheet_name='iris_b'
  9.                      usecols=["sl""sw""pl""pw""classes"]) 
  10.  
  11. data = pd.concat( 
  12.     [iris_a[iris_a["classes"] == 1], 
  13.      iris_b[iris_b["classes"] == 1]]).drop_duplicates() 
  14.  
  15. print(data) 
  16.  
  17. # 執(zhí)行上述代碼,輸出結(jié)果為: 
  18.     sl   sw   pl   pw  classes 
  19. 3  6.8  2.8  4.8  1.4        1 
  20. 4  6.7  3.0  5.0  1.7        1 
  21. 1  6.0  2.9  4.5  1.5        1 

JOIN 連接查詢

同樣,我們依舊使用如上演示數(shù)據(jù),如下: 

Python Pandas可以像SQL那樣,進行數(shù)據(jù)篩選統(tǒng)計

內(nèi)連接 INNER JOIN

獲取iris_a,iris_b兩個表中classes字段相同的記錄,并返回滿足條件的兩張表中的所有記錄。 

  1. SELECT * FROM iris_a  
  2. INNER JOIN iris_b  
  3. ON iris_a.classes = iris_b.classes; 

如上SQL實現(xiàn)iris_a 與 iris_b 按照classes字段進行內(nèi)連接。我們使用 pandas.merge(iris_a, iris_b, on='classes') 實現(xiàn)該SQL,代碼如下: 

  1. import pandas as pd 
  2.  
  3. iris_a = pd.read_excel(io="iris.xlsx"
  4.                      sheet_name='iris_a'
  5.                      usecols=["sl""sw""pl""pw""classes"]) 
  6.  
  7. iris_b = pd.read_excel(io="iris.xlsx"
  8.                      sheet_name='iris_b'
  9.                      usecols=["sl""sw""pl""pw""classes"]) 
  10.  
  11. inner = pd.merge(iris_a, iris_b, on="classes"
  12. print(inner
  13.  
  14. # 執(zhí)行上述代碼,輸出結(jié)果為: 
  15.    sl_x  sw_x  pl_x  pw_x  classes  sl_y  sw_y  pl_y  pw_y 
  16. 0   6.8   2.8   4.8   1.4        1   6.7   3.0   5.0   1.7 
  17. 1   6.8   2.8   4.8   1.4        1   6.0   2.9   4.5   1.5 
  18. 2   6.7   3.0   5.0   1.7        1   6.7   3.0   5.0   1.7 
  19. 3   6.7   3.0   5.0   1.7        1   6.0   2.9   4.5   1.5 

左連接 LEFT OUTER JOIN

獲取左表 iris_a 所有記錄,判斷每條數(shù)據(jù)的 classes 字段是否能匹配到右表iris_b的數(shù)據(jù),無論能否匹配到,左表 iris_a 數(shù)據(jù)都會保留。若能匹配,則左右表都保留。若不能匹配,右表iris_b字段都置空NULL,并返回保留的記錄。 

  1. SELECT * FROM iris_a  
  2. LEFT JOIN iris_b  
  3. ON iris_a.classes = iris_b.classes; 

如上SQL實現(xiàn)iris_a 與 iris_b 按照classes字段進行左連接。我們使用 pandas.merge(iris_a, iris_b, on='classes', how='left') 方法實現(xiàn)該SQL,代碼如下: 

  1. import pandas as pd 
  2.  
  3. iris_a = pd.read_excel(io="iris.xlsx"
  4.                      sheet_name='iris_a'
  5.                      usecols=["sl""sw""pl""pw""classes"]) 
  6.  
  7. iris_b = pd.read_excel(io="iris.xlsx"
  8.                      sheet_name='iris_b'
  9.                      usecols=["sl""sw""pl""pw""classes"]) 
  10.  
  11. inner = pd.merge(iris_a, iris_b, on="classes", how="left"
  12. print(inner
  13.  
  14. # 執(zhí)行上述代碼,輸出結(jié)果為: 
  15.    sl_x  sw_x  pl_x  pw_x  classes  sl_y  sw_y  pl_y  pw_y 
  16. 0   5.1   3.5   1.4   0.2        0   NaN   NaN   NaN   NaN 
  17. 1   4.9   3.0   1.4   0.2        0   NaN   NaN   NaN   NaN 
  18. 2   5.4   3.9   1.7   0.4        0   NaN   NaN   NaN   NaN 
  19. 3   6.8   2.8   4.8   1.4        1   6.7   3.0   5.0   1.7 
  20. 4   6.8   2.8   4.8   1.4        1   6.0   2.9   4.5   1.5 
  21. 5   6.7   3.0   5.0   1.7        1   6.7   3.0   5.0   1.7 
  22. 6   6.7   3.0   5.0   1.7        1   6.0   2.9   4.5   1.5 

右連接 RIGHT OUTER JOIN

獲取右表 iris_b 所有記錄,判斷每條數(shù)據(jù)的 classes 字段是否能匹配到右表 iris_a 的數(shù)據(jù),無論能否匹配到,右表 iris_b 數(shù)據(jù)都會保留。若能匹配,則左右表都保留。若不能匹配,左表iris_a字段都置空NULL,并返回保留的記錄。 

  1. SELECT * FROM iris_a  
  2. RIGHT JOIN iris_b  
  3. ON iris_a.classes = iris_b.classes; 

如上SQL實現(xiàn)iris_a 與 iris_b 按照classes字段進行右連接。我們使用 pandas.merge(iris_a, iris_b, on='classes', how='right')實現(xiàn)該SQL,代碼如下: 

  1. import pandas as pd 
  2.  
  3. iris_a = pd.read_excel(io="iris.xlsx"
  4.                      sheet_name='iris_a'
  5.                      usecols=["sl""sw""pl""pw""classes"]) 
  6.  
  7. iris_b = pd.read_excel(io="iris.xlsx"
  8.                      sheet_name='iris_b'
  9.                      usecols=["sl""sw""pl""pw""classes"]) 
  10.  
  11. inner = pd.merge(iris_a, iris_b, on="classes", how="right"
  12. print(inner
  13.  
  14. # 執(zhí)行上述代碼,輸出結(jié)果為: 
  15.    sl_x  sw_x  pl_x  pw_x  classes  sl_y  sw_y  pl_y  pw_y 
  16. 0   6.8   2.8   4.8   1.4        1   6.7   3.0   5.0   1.7 
  17. 1   6.7   3.0   5.0   1.7        1   6.7   3.0   5.0   1.7 
  18. 2   6.8   2.8   4.8   1.4        1   6.0   2.9   4.5   1.5 
  19. 3   6.7   3.0   5.0   1.7        1   6.0   2.9   4.5   1.5 
  20. 4   NaN   NaN   NaN   NaN        2   5.6   2.8   4.9   2.0 
  21. 5   NaN   NaN   NaN   NaN        2   7.7   2.8   6.7   2.0 
  22. 6   NaN   NaN   NaN   NaN        2   6.3   2.7   4.9   1.8 
  23. 7   NaN   NaN   NaN   NaN        2   6.7   3.3   5.7   2.1 

 

 

責(zé)任編輯:未麗燕 來源: 今日頭條
相關(guān)推薦

2023-02-15 08:24:12

數(shù)據(jù)分析數(shù)據(jù)可視化

2021-12-28 11:23:36

SQLServerExcel數(shù)據(jù)分析

2020-06-05 14:29:07

PythonPandas數(shù)據(jù)分析

2023-08-15 16:20:42

Pandas數(shù)據(jù)分析

2011-03-09 14:18:37

SQL數(shù)據(jù)累加

2022-06-24 09:58:35

大數(shù)據(jù)JavaPython

2017-04-26 14:02:18

大數(shù)據(jù)數(shù)據(jù)分析Excel

2020-08-14 10:45:26

Pandas可視化數(shù)據(jù)預(yù)處理

2015-05-20 16:57:13

2023-09-26 01:03:36

Pandas數(shù)據(jù)數(shù)據(jù)集

2020-09-23 06:59:46

C# 網(wǎng)頁數(shù)據(jù)

2024-10-28 12:57:36

Pandas數(shù)據(jù)清洗

2009-04-02 15:10:40

知識 介質(zhì)

2018-04-23 09:49:07

LinuxWSLWindows 10

2022-11-02 14:45:24

Python數(shù)據(jù)分析工具

2018-04-03 12:07:53

數(shù)據(jù)清洗PandasNumpy

2016-12-02 19:14:16

數(shù)據(jù)科學(xué)大數(shù)據(jù)

2019-07-11 10:52:02

Python統(tǒng)計數(shù)據(jù)

2025-02-10 10:29:32

2019-01-15 14:21:13

Python數(shù)據(jù)分析數(shù)據(jù)
點贊
收藏

51CTO技術(shù)棧公眾號