pandas筛选数据(就像和数据库一样)

序言#

因为我自己经常使用python进行数据处理,所以记录一篇教程,忘记时又能随时来回顾哦,顺便又能复习一遍刚学的数据库,哈哈

本文将通过pandas实现SQL语法中的条件过滤、排序、关联、合并、更新、删除等简单等操作,使我们对这些的概念及理解能够更加透彻,更加得心应手。

演示数据集#

本文采用安德森莺尾花卉(iris)数据集进行演示,iris数据集包含150个样本,对应数据集的每行数据。每行数据包含每个样本的四个特征和样本的类别信息,因此iris数据集是一个150行*5列的二维表。

我们可以UCI Iris dataset中获取或者使用from sklearn.datasets import load_iris 方式获取,为了演示方便我们只取其中部分数据,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
In [3]: load_iris()['data']
Out[3]:
array([[5.1, 3.5, 1.4, 0.2],
[4.9, 3. , 1.4, 0.2],
[4.7, 3.2, 1.3, 0.2],
[4.6, 3.1, 1.5, 0.2],
[5. , 3.6, 1.4, 0.2],
[5.4, 3.9, 1.7, 0.4],
[4.6, 3.4, 1.4, 0.3],
[5. , 3.4, 1.5, 0.2],
[4.4, 2.9, 1.4, 0.2],
[4.9, 3.1, 1.5, 0.1],
[5.4, 3.7, 1.5, 0.2],
[4.8, 3.4, 1.6, 0.2],
[4.8, 3. , 1.4, 0.1],
[4.3, 3. , 1.1, 0.1],

对应的特征名字,如下:

1
2
3
4
5
6
In [7]: load_iris().feature_names
Out[7]:
['sepal length (cm)',
'sepal width (cm)',
'petal length (cm)',
'petal width (cm)']

接下来,我们就开始学习如何使用pandas实现SQL语法中条件过滤、排序、关联、合并、更新、删除等数据查询操作

字段查询 SELECT#

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

如上SQL实现返回每行记录的sl,sw,pl,pw字段,仅返回2行记录。我们使用Pandas实现如上SQL的功能,代码如下:

1
2
3
4
5
6
7
8
9
10
In [10]: iris = pd.read_csv(load_iris().filename)

In [14]: iris.columns = ['sl','sw','pl','pw','classes'] # 这里为了方便,重新命名了列名

In [15]: search = iris[['sl','sw','pl','pw']].head(2)

In [16]: print(search)
sl sw pl pw
0 5.1 3.5 1.4 0.2
1 4.9 3.0 1.4 0.2

简单的条件过滤查询 WHERE#

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

如上SQL实现了查询满足classes=1的记录,并返回2行。我们使用Pandas实现该SQL,代码如下:

1
2
3
4
5
In [17]: search = iris[iris['classes']==1].head(2)
...: print(search)
sl sw pl pw classes
50 7.0 3.2 4.7 1.4 1
51 6.4 3.2 4.5 1.5 1

多条件的与或过滤查询 WHERE AND|OR与关系&#

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

如上SQL实现查询同时满足classes=1和pl>=5两个条件的记录,并返回2行。我们使用Pandas实现该SQL,代码如下:

1
2
3
4
5
In [19]: search = iris[(iris['classes']==1)&(iris['pl']>=5)].head(2)
...: print(search)
sl sw pl pw classes
77 6.7 3.0 5.0 1.7 1
83 6.0 2.7 5.1 1.6 1

或关系|

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

如上SQL实现查询满足sl>=5或者pl>=5任一条件的记录,返回2行。我们使用Pandas实现该SQL,代码如下:

1
2
3
4
5
In [20]: search = iris[(iris['sl']>=5) | (iris['pl']>=5)].head(2)
...: print(search)
sl sw pl pw classes
0 5.1 3.5 1.4 0.2 0
4 5.0 3.6 1.4 0.2 0

条件过滤 空值判断#

空判断 is null

1
SELECT * FROM IRIS WHERE sl IS NULL;

如上SQL实现查询sl字段为NULL的记录,我们使用Pandas实现该SQL,代码如下:

1
2
search = iris[iris['sl'].isna()]
print(search)# 因为数据集没有空值,所以不作演示了

非空判断 is not null

1
SELECT * FROM iris WHERE sl IS NOT NULL;

如上SQL实现查询sl字段不为NULL的记录。我们使用Pandas实现该SQL,代码如下:

1
2
3
4
5
6
7
8
In [23]: search = iris[iris['sl'].notna()]
...: print(search.head(5)) # 只演示了前5条数据
sl sw pl pw classes
0 5.1 3.5 1.4 0.2 0
1 4.9 3.0 1.4 0.2 0
2 4.7 3.2 1.3 0.2 0
3 4.6 3.1 1.5 0.2 0
4 5.0 3.6 1.4 0.2 0

排序 ORDER BY ASC|DESC#

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

如上SQL实现将满足sl字段值大于等于5的记录,按照classes降序排序。我们使用Pandas实现该SQL,代码如下:

1
2
3
4
5
6
7
8
In [26]: sort = iris[(iris['sl']>=5)].sort_values(by='classes',ascending=False) # asccending 默认为升序
...: print(sort.head(5))# 只演示了前5条数据
sl sw pl pw classes
149 5.9 3.0 5.1 1.8 2
112 6.8 3.0 5.5 2.1 2
123 6.3 2.7 4.9 1.8 2
122 7.7 2.8 6.7 2.0 2
121 5.6 2.8 4.9 2.0 2

更新 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
2
3
4
5
6
7
8
9
In [42]: print(iris[iris['pw']==1.7])
...: iris.loc[(iris['pw']==1.7) & (iris['pl']>=5),'classes'] = 2
...: print(iris[iris['pw']==1.7])
sl sw pl pw classes
77 6.7 3.0 5.0 1.7 1
106 4.9 2.5 4.5 1.7 2
sl sw pl pw classes
77 6.7 3.0 5.0 1.7 2
106 4.9 2.5 4.5 1.7 2

分组统计 GROUP BY#

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

如上SQL实现根据classes进行分组,返classes 及每组数量。我们使用Pandas实现该SQL,代码如下:

1
2
3
4
5
6
7
In [43]: search = iris.groupby('classes').size()
...: print(search)
classes
0 50
1 49
2 51
dtype: int64

分组统计 聚合输出#

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

如何SQL实现根据classes进行分组,返classes值,每个分组的pl平均值以及每个分组的sl最大值。我们使用Pandas实现该SQL,代码如下:

1
2
3
4
5
6
7
8
In [44]: import numpy as np
...: search = iris.groupby('classes').agg({'sl':np.max,'pl':np.mean})
...: print(search)
sl pl
classes
0 5.8 1.462000
1 7.0 4.244898
2 7.9 5.541176

删除#

1
DEKETE  FROM iris WHERE pw=1.7 and pl>=5;

如上SQL实现将同时满足pw=1.7和pl>=5的记录删除。我们使用Pandas实现该SQL,代码如下:

1
2
3
4
5
6
7
8
9
In [46]: drop = iris.drop(iris[(iris['pw']==1.7) & (iris['pl']==5)].index)
...:
...: print(drop[drop['pw']>1.6])
sl sw pl pw classes
70 5.9 3.2 4.8 1.8 1
100 6.3 3.3 6.0 2.5 2
101 5.8 2.7 5.1 1.9 2
102 7.1 3.0 5.9 2.1 2
103 6.3 2.9 5.6 1.8 2
北月 wechat
欢迎您扫一扫上面的微信公众号( 或者搜索:WK_wwxk )订阅吾空的微信公众号
┭┮﹏┭┮学业繁忙,暂未运营,没时间,先挂着瞅瞅,嘿嘿
可以对我进行打赏了哦!!!
如果觉得本文对您有启发,可以随意打赏一点鼓励我继续更新!
显示 Gitment 评论
0%