作者:费弗里
博客地址:
https://www.cnblogs.com/feffery/p/12179647.html
说明:本文经作者授权转载,禁止二次转载
本文对应脚本及数据已上传至我的
Github
仓库https://github.com/CNFeffery/DataScienceStudyNotes
1 简介
在数据分析任务中,从原始数据读入,到最后分析结果出炉,中间绝大部分时间都是在对数据进行一步又一步的加工规整,以流水线(pipeline)的方式完成此过程更有利于梳理分析脉络,也更有利于查错改正。pdpipe
作为专门针对pandas
进行流水线化改造的模块,为熟悉pandas
的数据分析人员书写优雅易读的代码提供一种简洁的思路,本文就将针对pdpipe
的用法进行介绍。
2 pdpipe常用功能介绍
pdpipe
的出现极大地对数据分析过程进行规范,其主要拥有以下特性:
- 简洁的语法逻辑
- 在流水线工作过程中可输出规整的提示或错误警报信息
- 轻松串联不同数据操作以组成一条完整流水线
- 轻松处理多种类型数据
- 纯
Python
编写,便于二次开发
通过pip install pdpipe
安装完成,接下来我们将在jupyter lab
中以TMDB 5000 Movie Dataset中的tmdb_5000_movies.csv
数据集(图1)为例来介绍pdpipe
的主要功能。
这是Kaggle上的公开数据集,记录了一些电影的相关属性信息,你也可以在数据科学学习手札系列文章的Github
仓库对应本篇文章的路径下直接获取该数据集。
![652b61c987eccd57dd0cad7a7897317a.png](https://i-blog.csdnimg.cn/blog_migrate/ff55430c86a3ba64b1c9b862d8254914.jpeg)
2.1 从一个简单的例子开始
首先在jupyter lab
中读入tmdb_5000_movies.csv
数据集并查看其前3行(图2):
import pandas as pd
import pdpipe
# 读入tmdb_5000_movies.csv数据集并查看前3行
data = pd.read_csv('tmdb_5000_movies.csv');data.head(3)
![4998cf75f372ee49a929d14942243936.png](https://i-blog.csdnimg.cn/blog_migrate/f0f250e38bbe9212df243b68c0e4d22b.png)
可以看出,数据集包含了数值、日期、文本以及json等多种类型的数据,现在假设我们需要基于此数据完成以下流程:
1、删除original_title列
2、对title列进行小写化处理
3、丢掉vote_average小于等于7,且original_language不为en
的行
4、求得genres对应电影类型的数量保存为新列genres_num,并删除原有的genres列
5、丢掉genres_num小于等于5的行
上述操作直接使用pandas
并不会花多少时间,但是想要不创造任何中间临时结果一步到位产生所需的数据框子集,并且保持代码的可读性不是一件太容易的事,但是利用pdpipe
,我们可以非常优雅地实现上述过程:
# 以pdp.PdPipeline传入流程列表的方式创建pipeline
first_pipeline = pdp.PdPipeline([pdp.ColDrop("original_title"),
pdp.ApplyByCols(columns=['title'], func=lambda x: x.lower()),
pdp.RowDrop({
'vote_average': lambda x: x <= 7, 'original_language': lambda x: x != 'en'}),
pdp.ApplyByCols(columns=['genres'], func=lambda x: [item['name'] for item in eval(x)].__len__(), result_columns=['genres_num']),
pdp.RowDrop({
'genres_num': lambda x: x <= 5})])
# 将创建的pipeline直接作用于data直接得到所需结果,并打印流程信息
first_pipeline(data, verbose=True).reset_index(drop=True)
得到的结果如图3所示:
![2880b0fafcfdee97d90c4dac3d679edb.png](https://i-blog.csdnimg.cn/blog_migrate/558eb756fcc9ac7e02f1721fb9e8d481.png)
我们不仅保证了代码优雅简洁,可读性强,结果的一步到位,还自动打印出整个流水线运作过程的状态说明!
令人兴奋的是pdpipe
充分封装了pandas
的核心功能尤其是apply
相关操作,使得常规或非常规的数据分析任务都可以利用pdpipe
中的API结合自定义函数来优雅地完成,小小领略到pdpipe
的妙处之后,下文我们来展开详细介绍。
2.2 pdpipe中的重要子模块
pdpipe
中的API按照不同分工被划分到若干子模块,下面将针对常用的几类API展开介绍。
2.2.1 basic_stages
basic_stages
中包含了对数据框中的行、列进行丢弃/保留、重命名以及重编码的若干类:
ColDrop:
这个类用于对指定单个或多个列进行丢弃,其主要参数如下:
- columns:字符串或列表,用于指定需要丢弃的列名
- errors:字符串,传入 'ignore' 或 'raise',用于指定丢弃指定列时遇到错误采取的应对策略,'ignore'表示忽略异常,'raise'表示抛出错误打断流水线运作,默认为'raise'
下面是举例演示(注意单个流水线部件可以直接传入源数据执行apply
方法直接得到结果),我们分别对单列和多列进行删除操作:
- 单列删除
# 删除budget列
pdp.ColDrop(columns='budget').apply(data).head(3)
删除后得到的结果如图4:
![8f5a8ede352113c6b97e148fd90c80c5.png](https://i-blog.csdnimg.cn/blog_migrate/3a68956b46a9bb3091b5c8b33afbfbea.png)
- 多列删除
# 删除budget之外的所有列
del_col = data.columns.tolist()
del_col.remove('budget')
pdp.ColDrop(columns=del_col).apply