前言
最近有小伙伴推荐我多写写一个增强 pandas 功能的库—— pyjanitor
。他提供了许多实用功能,结合 pandas 使用能够大大提升我们的代码效率,那么我就针对这个库做一个系列教程。
不过,我不喜欢只是到官网抄一下例子,把英文翻译成中文,草草了事。我也不希望大家只是记住了 pyjanitor 的一些方法名字,只会简单套用。
因此,这个系列的文章我会挑选 pyjanitor
的一些方法做讲解,同时会给出 pandas 的实现,还教你怎么自己封装函数。
本系列文章的基本结构:
pyjanitor
函数讲解- pandas 原生实现
- 自己封装一个函数
pyjanitor 安装:
代码语言:javascript复制pip install pyjanitor
今天的主题是多条件判断,分支判断取值是数据处理的高频操作。往往初学者会使用 apply 遍历每一行,使用 python 的 if else 语法完成需求。如下:
数据:
代码:
- 新增一列 value,里面就是一大堆的逻辑判断
代码倒是不复杂,但是条件很多,数据也多的情况下,代码就会难看,并且代码的执行速度也不行。
pyjanitor 的 case_when
代码来自于官网
结果是对了,但是感觉 case when 方法里面的东西很乱呀
我来标注一下:
- 红色框是条件,绿色框是返回值
但是,我们不是一定要使用 janitor 才能做到这一切。结合 numpy 我们也能轻易做到
numpy 也有 case when
如果你学过我的 pandas 专栏,那么就一定会 numpy 的两个条件函数,这里我们只需要用 select 就可以轻易做到多条件分支
关于 np.select 详细讲解,可以查看专栏文章
那么,我们该如何自己写一个类似 janitor 的函数,方便以后重复使用?
自己写一个也不难
首先,不管三七二十一,定义一个函数,把之前的 numpy 实现代码复制进去:
这里有几个问题:
- 参数有哪些
- 尽量不要直接修改数据源,现在我们是直接赋值一列到 df 里面
先加上参数:
- 参数 df:总要传入数据吧
- *conditions:分支条件的数量是无限的,所以需要使用
*
,表示不管你传入多少个参数,我都接下来,放进去 conditions 这个变量里面。所以,conditions 是一个元组 - col_name:新列的名字
现在再来看 np.select 是需要把所有的条件给放一起,但现在 conditions 是每隔一个位置才是分支条件,利用 python 的切片功能就可以轻易分开:
- 行2,3:利用切片的最后一个参数 step ,让其每隔2个位置取出元素,配合开始位置,就可以取出所有的奇数位置或偶数位置的元素
最后,我们不希望修改了源数据,可以使用 pandas 提供的方法做到: