首先,数据仍然用我们一直以来用的张三团伙表。
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
任意位置的数据。 明白这一点之后,其实就很容易理解其条件查询功能了。
比如我想找到所有姓张的人的信息:
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)
可以看到,第二种方法实际上并没有明显快多少。并且如果加上添加检索规则的时间反而更慢。
很明显作者只考虑了检索的时间,并没有计算制定规则的时间。所以在具体使用时还是需要自己多做一些测试。(这也就是免费工具的不好之处)。
类似地,还可以利用上述方式实现更为复杂的查询。
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中返回下标操作函数-节约时间的利器
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
方法主要还是用于列的比较。
除了上述方法之外,还有:
query
方法的条件处理
MultiIndex
情况下的处理
get
方法
lookup
方法等等
一、Pandas简介与安装
二、Pandas基本数据结构-DataFrame与Series
三、Pandas文件读写
四、Pandas数据索引方式
五、Pandas简单统计操作及通用方式
六、Pandas条件查询
七、Pandas缺失数据的处理(数据清洗基础)
八、Pandas数据透视表
九、表的合并、连接、拼接(数据聚合基础)