分分享一下之前結(jié)合SQL梳理過的Pandas使用教程,。 相對(duì)于學(xué)習(xí)Pandas各種數(shù)據(jù)篩選操作,SQL語(yǔ)法顯得更加簡(jiǎn)潔清晰,,若能夠?qū)QL語(yǔ)法與Pandas中對(duì)應(yīng)的函數(shù)的使用方法關(guān)聯(lián)起來,,對(duì)于我們應(yīng)用Pandas進(jìn)行數(shù)據(jù)篩選來講無(wú)疑是一個(gè)福音。 本文通過Pandas實(shí)現(xiàn)SQL語(yǔ)法中條件過濾,、排序,、關(guān)聯(lián)、合并,、更新,、刪除等簡(jiǎn)單及復(fù)雜操作,使得我們對(duì)方法的理解更加深刻,,更加得心應(yīng)手,。 演示數(shù)據(jù)集本文采用安德森鳶尾花卉(iris)數(shù)據(jù)集進(jìn)行演示,,iris數(shù)據(jù)集包含150個(gè)樣本,,對(duì)應(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語(yǔ)法中條件過濾、排序,、關(guān)聯(lián),、合并、更新,、刪除等數(shù)據(jù)查詢操作,。 字段查詢 SELECT如上SQL實(shí)現(xiàn)返回每行記錄的 sl,sw,pl,pw 字段,僅返回2行記錄,。我們使用Pandas實(shí)現(xiàn)如上SQL的功能,,代碼如下: 簡(jiǎn)單的條件過濾查詢 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 語(yǔ)句的結(jié)果集,,需注意,,UNION ALL 內(nèi)部的 SELECT 語(yǔ)句必須擁有相同數(shù)量的列,列也必須擁有相似的數(shù)據(jù)類型,。同時(shí),,每條 SELECT 語(yǔ)句中的列的順序必須相同。 如上SQL實(shí)現(xiàn)將兩個(gè)查詢結(jié)果進(jìn)行合并,,允許存在重復(fù)記錄,。我們使用 pandas.concat 方法實(shí)現(xiàn)該SQL,代碼如下: 合并結(jié)果 UNION 不存在重復(fù)記錄 合并如下兩個(gè) SELECT 語(yǔ)句的結(jié)果集,,同時(shí)也需注意,,UNION 內(nèi)部的 SELECT 語(yǔ)句必須擁有相同數(shù)量的列,列也必須擁有相似的數(shù)據(jù)類型,。同時(shí),,每條 SELECT 語(yǔ)句中的列的順序必須相同。 如上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ù),無(wú)論能否匹配到,,左表 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ù),,無(wú)論能否匹配到,右表 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,,代碼如下: |
|