序言#
因为我自己经常使用python进行数据处理,所以记录一篇教程,忘记时又能随时来回顾哦,顺便又能复习一遍刚学的数据库,哈哈
本文将通过pandas实现SQL语法中的条件过滤、排序、关联、合并、更新、删除等简单等操作,使我们对这些的概念及理解能够更加透彻,更加得心应手。
演示数据集#
本文采用安德森莺尾花卉(iris)数据集进行演示,iris数据集包含150个样本,对应数据集的每行数据。每行数据包含每个样本的四个特征和样本的类别信息,因此iris数据集是一个150行*5列的二维表。
我们可以UCI Iris dataset中获取或者使用from sklearn.datasets import load_iris
方式获取,为了演示方便我们只取其中部分数据,如下:
1 | In [3]: load_iris()['data'] |
对应的特征名字,如下:
1 | In [7]: load_iris().feature_names |
接下来,我们就开始学习如何使用pandas实现SQL语法中条件过滤、排序、关联、合并、更新、删除等数据查询操作
字段查询 SELECT#
1 | SELECT sl,sw,pl,pw FROM iris LIMIT 2; |
如上SQL实现返回每行记录的sl,sw,pl,pw字段,仅返回2行记录。我们使用Pandas实现如上SQL的功能,代码如下:
1 | In [10]: iris = pd.read_csv(load_iris().filename) |
简单的条件过滤查询 WHERE#
1 | SELECT * FROM iris WHERE classes=1 LIMIT 2; |
如上SQL实现了查询满足classes=1的记录,并返回2行。我们使用Pandas实现该SQL,代码如下:
1 | In [17]: search = iris[iris['classes']==1].head(2) |
多条件的与或过滤查询 WHERE AND|OR与关系&#
1 | SELECT * FROM iris WHERE classes=1 AND p1 >= 5 LIMIT 2; |
如上SQL实现查询同时满足classes=1和pl>=5两个条件的记录,并返回2行。我们使用Pandas实现该SQL,代码如下:
1 | In [19]: search = iris[(iris['classes']==1)&(iris['pl']>=5)].head(2) |
或关系|
1 | SELECT * FROM iris WHERE sl>=5 OR pl>=5 LIMIT 2; |
如上SQL实现查询满足sl>=5或者pl>=5任一条件的记录,返回2行。我们使用Pandas实现该SQL,代码如下:
1 | In [20]: search = iris[(iris['sl']>=5) | (iris['pl']>=5)].head(2) |
条件过滤 空值判断#
空判断 is null
1 | SELECT * FROM IRIS WHERE sl IS NULL; |
如上SQL实现查询sl字段为NULL的记录,我们使用Pandas实现该SQL,代码如下:
1 | search = iris[iris['sl'].isna()] |
非空判断 is not null
1 | SELECT * FROM iris WHERE sl IS NOT NULL; |
如上SQL实现查询sl字段不为NULL的记录。我们使用Pandas实现该SQL,代码如下:
1 | In [23]: search = iris[iris['sl'].notna()] |
排序 ORDER BY ASC|DESC#
1 | SELECT * FROM iris WHERE sl>=5 ORDER BY DESC classes; |
如上SQL实现将满足sl字段值大于等于5的记录,按照classes降序排序。我们使用Pandas实现该SQL,代码如下:
1 | In [26]: sort = iris[(iris['sl']>=5)].sort_values(by='classes',ascending=False) # asccending 默认为升序 |
更新 UPDATE#
1 | UPDATE iris SET classes=2 WHERE pw=1.7 AND pl>=2.5; |
如上SQL实现将同时满足pw=1.7和pl>=5的记录中的classes字段值更新为2。我们使用Pandas实现该SQL,代码如下:
1 | In [42]: print(iris[iris['pw']==1.7]) |
分组统计 GROUP BY#
1 | SELECT classes,COUNT(*) FROM iris GROUP BY classes; |
如上SQL实现根据classes进行分组,返classes 及每组数量。我们使用Pandas实现该SQL,代码如下:
1 | In [43]: search = iris.groupby('classes').size() |
分组统计 聚合输出#
1 | SELECT classes,avg(pl),max(sl) FROM iris GROUP BY classes; |
如何SQL实现根据classes进行分组,返classes值,每个分组的pl平均值以及每个分组的sl最大值。我们使用Pandas实现该SQL,代码如下:
1 | In [44]: import numpy as np |
删除#
1 | DEKETE FROM iris WHERE pw=1.7 and pl>=5; |
如上SQL实现将同时满足pw=1.7和pl>=5的记录删除。我们使用Pandas实现该SQL,代码如下:
1 | In [46]: drop = iris.drop(iris[(iris['pw']==1.7) & (iris['pl']==5)].index) |