|
分分享一下之前結(jié)合SQL梳理過的Pandas使用教程。 相對于學(xué)習(xí)Pandas各種數(shù)據(jù)篩選操作,SQL語法顯得更加簡潔清晰,若能夠?qū)QL語法與Pandas中對應(yīng)的函數(shù)的使用方法關(guān)聯(lián)起來,對于我們應(yīng)用Pandas進(jìn)行數(shù)據(jù)篩選來講無疑是一個(gè)福音。 本文通過Pandas實(shí)現(xiàn)SQL語法中條件過濾、排序、關(guān)聯(lián)、合并、更新、刪除等簡單及復(fù)雜操作,使得我們對方法的理解更加深刻,更加得心應(yīng)手。 演示數(shù)據(jù)集本文采用安德森鳶尾花卉(iris)數(shù)據(jù)集進(jìn)行演示,iris數(shù)據(jù)集包含150個(gè)樣本,對應(yīng)數(shù)據(jù)集的每行數(shù)據(jù)。每行數(shù)據(jù)包含每個(gè)樣本的四個(gè)特征和樣本的類別信息,因此iris數(shù)據(jù)集是一個(gè)150行*5列的二維表。 我們可以 UCI Iris dataset 中獲取或者使用 from sklearn.datasets import load_iris 方式獲取,為了演示方便我們只取其中10行數(shù)據(jù),如下: 接下來,就讓我們一起學(xué)習(xí)一下,如何Pandas實(shí)現(xiàn)SQL語法中條件過濾、排序、關(guān)聯(lián)、合并、更新、刪除等數(shù)據(jù)查詢操作。 字段查詢 SELECT如上SQL實(shí)現(xiàn)返回每行記錄的 sl,sw,pl,pw 字段,僅返回2行記錄。我們使用Pandas實(shí)現(xiàn)如上SQL的功能,代碼如下: 簡單的條件過濾查詢 WHERE 如上SQL實(shí)現(xiàn)了查詢滿足classes=1的記錄,并返回2行。我們使用Pandas實(shí)現(xiàn)該SQL,代碼如下: 多條件的與或過濾查詢 WHERE AND|OR與關(guān)系 & 如上SQL實(shí)現(xiàn)查詢同時(shí)滿足classes=1 和 pl >=5 兩個(gè)條件的記錄,并返回2行。我們使用Pandas實(shí)現(xiàn)該SQL,代碼如下: 或關(guān)系 | 如上SQL實(shí)現(xiàn)查詢滿足 sl >=5 或者 pl >=5 任一條件的記錄,返回2行。我們使用Pandas實(shí)現(xiàn)該SQL,代碼如下: 條件過濾 空值判斷空判斷 is null 如上SQL實(shí)現(xiàn)查詢 sl 字段為NULL的記錄,我們使用Pandas實(shí)現(xiàn)該SQL,代碼如下: ![]() 非空判斷 is not null![]() 如上SQL實(shí)現(xiàn)查詢sl字段不為 NULL 的記錄。我們使用Pandas實(shí)現(xiàn)該SQL,代碼如下: ![]() 排序 ORDER BY ASC|DESC![]() 如上SQL實(shí)現(xiàn)將滿足sl字段值大于等于5的記錄,按照classes降序排序。我們使用Pandas實(shí)現(xiàn)該SQL,代碼如下: ![]() 更新 UPDATE![]() 如上SQL實(shí)現(xiàn)將同時(shí)滿足pw = 1.7 和 pl >= 5的記錄中的classes字段值更新為2。我們使用Pandas實(shí)現(xiàn)該SQL,代碼如下: ![]() 分組統(tǒng)計(jì) GROUP BY![]() 如上SQL實(shí)現(xiàn) 根據(jù)classes進(jìn)行分組,返回classes 及每組數(shù)量。我們使用Pandas實(shí)現(xiàn)該SQL,代碼如下: ![]() 分組統(tǒng)計(jì) 聚合輸出![]() 如何SQL實(shí)現(xiàn)根據(jù)classes進(jìn)行分組,返回classes值,每個(gè)分組的pl平均值以及每個(gè)分組的sl最大值。我們使用Pandas實(shí)現(xiàn)該SQL,代碼如下: ![]() 刪除![]() 如上SQL實(shí)現(xiàn)將同時(shí)滿足pw = 1.7 和 pl >= 5的記錄刪除。我們使用Pandas實(shí)現(xiàn)該SQL,代碼如下: ![]() UNION & JOIN 演示數(shù)據(jù)集接下來介紹如何使用Pandas進(jìn)行合并查詢及多表關(guān)聯(lián)查詢,為了演示方便,我們上面示例中的iris數(shù)據(jù)集,拆分成iris_a,iris_b兩部分,如下: ![]() UNION 合并查詢合并結(jié)果 UNION ALL 可能存在重復(fù)記錄 合并如下兩個(gè) SELECT 語句的結(jié)果集,需注意,UNION ALL 內(nèi)部的 SELECT 語句必須擁有相同數(shù)量的列,列也必須擁有相似的數(shù)據(jù)類型。同時(shí),每條 SELECT 語句中的列的順序必須相同。 ![]() 如上SQL實(shí)現(xiàn)將兩個(gè)查詢結(jié)果進(jìn)行合并,允許存在重復(fù)記錄。我們使用 pandas.concat 方法實(shí)現(xiàn)該SQL,代碼如下: ![]() 合并結(jié)果 UNION 不存在重復(fù)記錄 合并如下兩個(gè) SELECT 語句的結(jié)果集,同時(shí)也需注意,UNION 內(nèi)部的 SELECT 語句必須擁有相同數(shù)量的列,列也必須擁有相似的數(shù)據(jù)類型。同時(shí),每條 SELECT 語句中的列的順序必須相同。 ![]() 如上SQL實(shí)現(xiàn)將兩個(gè)select查詢結(jié)果進(jìn)行合并,不允許存在重復(fù)記錄。我們使用 pandas.concat.drop_duplicates 方法 實(shí)現(xiàn)該SQL,代碼如下: ![]() JOIN 連接查詢同樣,我們依舊使用如上演示數(shù)據(jù),如下: ![]() 內(nèi)連接 INNER JOIN獲取iris_a,iris_b兩個(gè)表中classes字段相同的記錄,并返回滿足條件的兩張表中的所有記錄。 ![]() 如上SQL實(shí)現(xiàn)iris_a 與 iris_b 按照classes字段進(jìn)行內(nèi)連接。我們使用 pandas.merge(iris_a, iris_b, on='classes') 實(shí)現(xiàn)該SQL,代碼如下: ![]() 左連接 LEFT OUTER JOIN獲取左表 iris_a 所有記錄,判斷每條數(shù)據(jù)的 classes 字段是否能匹配到右表iris_b的數(shù)據(jù),無論能否匹配到,左表 iris_a 數(shù)據(jù)都會(huì)保留。若能匹配,則左右表都保留。若不能匹配,右表iris_b字段都置空NULL,并返回保留的記錄。 ![]() 如上SQL實(shí)現(xiàn)iris_a 與 iris_b 按照classes字段進(jìn)行左連接。我們使用 pandas.merge(iris_a, iris_b, on='classes', how='left') 方法實(shí)現(xiàn)該SQL,代碼如下: ![]() 右連接 RIGHT OUTER JOIN獲取右表 iris_b 所有記錄,判斷每條數(shù)據(jù)的 classes 字段是否能匹配到右表 iris_a 的數(shù)據(jù),無論能否匹配到,右表 iris_b 數(shù)據(jù)都會(huì)保留。若能匹配,則左右表都保留。若不能匹配,左表iris_a字段都置空NULL,并返回保留的記錄。 ![]() 如上SQL實(shí)現(xiàn)iris_a 與 iris_b 按照classes字段進(jìn)行右連接。我們使用 pandas.merge(iris_a, iris_b, on='classes', how='right')實(shí)現(xiàn)該SQL,代碼如下: ![]() |
|
|