嫌 pandas 的方法不够简洁方便,那你一定是没有使用它的增强库

2022-04-19 08:17:50 浏览数 (1)

前言

最近有小伙伴推荐我多写写一个增强 pandas 功能的库—— pyjanitor 。他提供了许多实用功能,结合 pandas 使用能够大大提升我们的代码效率,那么我就针对这个库做一个系列教程。

不过,我不喜欢只是到官网抄一下例子,把英文翻译成中文,草草了事。我也不希望大家只是记住了 pyjanitor 的一些方法名字,只会简单套用。

因此,这个系列的文章我会挑选 pyjanitor 的一些方法做讲解,同时会给出 pandas 的实现,还教你怎么自己封装函数。

本系列文章的基本结构:

  1. pyjanitor 函数讲解
  2. pandas 原生实现
  3. 自己封装一个函数

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 实现代码复制进去:

这里有几个问题:

  1. 参数有哪些
  2. 尽量不要直接修改数据源,现在我们是直接赋值一列到 df 里面

先加上参数:

  • 参数 df:总要传入数据吧
  • *conditions:分支条件的数量是无限的,所以需要使用 * ,表示不管你传入多少个参数,我都接下来,放进去 conditions 这个变量里面。所以,conditions 是一个元组
  • col_name:新列的名字

现在再来看 np.select 是需要把所有的条件给放一起,但现在 conditions 是每隔一个位置才是分支条件,利用 python 的切片功能就可以轻易分开:

  • 行2,3:利用切片的最后一个参数 step ,让其每隔2个位置取出元素,配合开始位置,就可以取出所有的奇数位置或偶数位置的元素

最后,我们不希望修改了源数据,可以使用 pandas 提供的方法做到:

有没有觉得 janitor 很好用,评论区说说你的感受

0 人点赞