Pandas简明教程:六、Pandas条件查询


目前大家公认的一个说法是:Python的用户主要集中在数据分析和机器学习这两类人群。数据分析人员之所以喜欢用它就是因为Python的各种数据处理工具的查询检索方式都非常简单易用。这篇教程就主要介绍Pandas的数据查询方法,借此可以感受一下Pandas的便利。

1、基本方法

首先,数据仍然用我们一直以来用的张三团伙表

df

    月份  姓名 性别  应发工资   实发工资  职位
0    1  张三  男  2000   1500  主犯
1    2  张三  男  2000   1000  主犯
2    3  张三  女  2000  15000  主犯
3    4  张三  女  2000   1500  主犯
4    5  张三  女  2000   1500  主犯
5    2  李四  男  1800   1300  从犯
6    3  李四  男  1800   1300  从犯
7    4  李四  男  1800   1300  从犯
8    5  李四  男  1800   1300  从犯
9    1  王五  女  1800   1300  龙套
10   2  王五  女  1800   1300  龙套
11   3  王五  女  1800   1300  龙套
12   4  王五  女  1800   1300  龙套

比如此时我们只想查看性别为男的人员信息:(等式条件)

df[df['性别'] == '男']

   月份  姓名 性别  应发工资  实发工资  职位
0   1  张三  男  2000  1500  主犯
1   2  张三  男  2000  1000  主犯
5   2  李四  男  1800  1300  从犯
6   3  李四  男  1800  1300  从犯
7   4  李四  男  1800  1300  从犯

或者工资大于2000的信息:(不等式条件)

df[df['实发工资']>2000]

   月份  姓名 性别  应发工资   实发工资  职位
2   3  张三  女  2000  15000  主犯

或者所有人员中实发工资大于1400且性别为男的信息:(多条件)

df[(df['实发工资']>1000) & (df['性别'] == '男')]

   月份  姓名 性别  应发工资  实发工资  职位
0   1  张三  男  2000  1500  主犯
5   2  李四  男  1800  1300  从犯
6   3  李四  男  1800  1300  从犯
7   4  李四  男  1800  1300  从犯
8   5  李四  男  1800  1300  从犯

这里简单小结一下,基本的查询规则即是在df后加入查询条件,而这个条件可以是df任意位置的数据。 明白这一点之后,其实就很容易理解其条件查询功能了。

2、高级查询

比如我想找到所有姓张的人的信息:

df[[x.startswith('张') for x in df['姓名']]]

   月份  姓名 性别  应发工资   实发工资  职位
0   1  张三  男  2000   1500  主犯
1   2  张三  男  2000   1000  主犯
2   3  张三  女  2000  15000  主犯
3   4  张三  女  2000   1500  主犯
4   5  张三  女  2000   1500  主犯

这里stratswith方法是Python自带的字符串方法,点这里查看详细说明

还有一种方法:

criterion = df['姓名'].map(lambda x: x.startswith('张'))

df[criterion]

   月份  姓名 性别  应发工资   实发工资  职位
0   1  张三  男  2000   1500  主犯
1   2  张三  男  2000   1000  主犯
2   3  张三  女  2000  15000  主犯
3   4  张三  女  2000   1500  主犯
4   5  张三  女  2000   1500  主犯

官方称第二种方法更快,我们来测试一下:

# 第一种方法
%timeit df[[x.startswith('张') for x in df['姓名']]]
203 µs ± 8.92 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

# 第二种方法
%timeit criterion = df['姓名'].map(lambda x: x.startswith('张'))
93.2 µs ± 6.21 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%timeit df[criterion] 
201 µs ± 2.44 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

可以看到,第二种方法实际上并没有明显快多少。并且如果加上添加检索规则的时间反而更慢。

很明显作者只考虑了检索的时间,并没有计算制定规则的时间。所以在具体使用时还是需要自己多做一些测试。(这也就是免费工具的不好之处)。

类似地,还可以利用上述方式实现更为复杂的查询。

3、 可用于修改内容的where方法

先看用法:

df.where(df['性别'] == '男')

     月份   姓名   性别    应发工资    实发工资   职位
0   1.0   张三    男  2000.0  1500.0   主犯
1   2.0   张三    男  2000.0  1000.0   主犯
2   NaN  NaN  NaN     NaN     NaN  NaN
3   NaN  NaN  NaN     NaN     NaN  NaN
4   NaN  NaN  NaN     NaN     NaN  NaN
5   2.0   李四    男  1800.0  1300.0   从犯
6   3.0   李四    男  1800.0  1300.0   从犯
7   4.0   李四    男  1800.0  1300.0   从犯
8   5.0   李四    男  1800.0  1300.0   从犯
9   NaN  NaN  NaN     NaN     NaN  NaN
10  NaN  NaN  NaN     NaN     NaN  NaN
11  NaN  NaN  NaN     NaN     NaN  NaN
12  NaN  NaN  NaN     NaN     NaN  NaN

这里where的使用和直接访问标签的方式就有所不同了,这是将所有满足条件的项保持原状,而其它项全部设为NaN。如果要替换数据的话,需要比较复杂的表达式,这里只看一个简单的例子:

dates = pd.date_range('1/1/2000', periods=8)

df = pd.DataFrame(np.random.randn(8, 4),index=dates, columns=['A', 'B', 'C', 'D'])

df.where(df < 0, -df)

                   A         B         C         D
2000-01-01 -2.843891 -0.140803 -1.816075 -0.248443
2000-01-02 -0.195239 -1.014760 -0.621017 -0.308201
2000-01-03 -0.773316 -0.411646 -1.091336 -0.486160
2000-01-04 -1.753884 -0.596536 -0.273482 -0.685287
2000-01-05 -1.125159 -0.549449 -0.275434 -0.861960
2000-01-06 -1.059645 -1.600819 -0.085352 -0.406073
2000-01-07 -1.692449 -1.767384 -0.266578 -0.593165
2000-01-08 -0.163517 -1.645777 -1.509307 -0.637490

这里插一句:实际上numpy也有where方法,用法类似,可参考:Python Numpy中返回下标操作函数-节约时间的利器

4、条件检索进阶:快速的查询方法query
df.query('姓名>性别')

    月份  姓名 性别  应发工资   实发工资  职位
2    3  张三  女  2000  15000  主犯
3    4  张三  女  2000   1500  主犯
4    5  张三  女  2000   1500  主犯
9    1  王五  女  1800   1300  龙套
10   2  王五  女  1800   1300  龙套
11   3  王五  女  1800   1300  龙套
12   4  王五  女  1800   1300  龙套

这里,字符串的比较可以查看Python的字符串比较。当然,这里可以看到,query方法主要还是用于列的比较。

5、其它检索方法简述

除了上述方法之外,还有:

query方法的条件处理

MultiIndex情况下的处理

get方法

lookup方法

等等

本系列教程教程完整目录:

一、Pandas简介与安装

二、Pandas基本数据结构-DataFrame与Series

三、Pandas文件读写

四、Pandas数据索引方式

五、Pandas简单统计操作及通用方式

六、Pandas条件查询

七、Pandas缺失数据的处理(数据清洗基础)

八、Pandas数据透视表

九、表的合并、连接、拼接(数据聚合基础)

  • 21
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半个冯博士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值