(数据科学学习手札134)pyjanitor:为pandas补充更多功能
本文示例代码及文件已上传至我的
Github仓库https://github.com/CNFeffery/DataScienceStudyNotes
1 简介
pandas发展了如此多年,所包含的功能已经覆盖了大部分数据清洗、分析场景,但仍然有着相当一部分的应用场景pandas中尚存空白亦或是现阶段的操作方式不够简洁方便。
今天我要给大家介绍的Python库pyjanitor就内置了诸多功能方法,可以在兼容pandas中数据框等数据结构的同时为pandas补充更多功能。它是对R中著名的数据清洗包janitor的移植,就如同它的名字那样,帮助我们完成数据处理的清洁工作:

2 pyjanitor中的常用功能
对于使用conda的朋友,推荐使用下列命令完成pyjanitor的安装,其中使用到上海交大的conda-forge镜像:
conda install pyjanitor -c https://mirrors.sjtug.sjtu.edu.cn/anaconda/cloud/conda-forge -y
完成安装后import janitor即可进行导入,接着我们就可以直接在pandas的代码逻辑中穿插pyjanitor的各种API接口。
pyjanitor中的很多功能实际上跟pandas中的一些功能存在重叠,作为一位pandas老手,这部分功能费老师我还是倾向于使用pandas完成,因此下面我只给大家介绍一些pyjanitor中颇具特色的功能:
2.1 利用also()方法穿插执行任意函数
熟悉pandas链式写法的朋友应该知道这种写法对于处理数据和理清步骤有多高效,pyjanitor中的also()方法允许我们在链式过程中随意插入执行任意函数,接受上一步状态的数据框运算结果,且不影响对下一步处理逻辑的数据输入,我非常喜欢这个功能,下面是一个简单的例子:
df = (
# 构造示例数据框
pd.DataFrame({"a": [1, 2, 3], "b": list("abc")})
.query("a > 1")
# 利用also()插入lambda函数接受上一步的输入对象
.also(lambda df: print(f"a字段<=1的记录有{df.query('a <= 1').shape[0]}行"))
.rename(columns={'a': 'new_a'})
# 利用also()实现中间计算结果的导出
.also(lambda df: df.to_csv("temp.csv", index=False))
# 利用also()打印到这一步时数据框计算结果的字段名
.also(
lambda df: print(f"字段名:{df.columns.tolist()}")
)
.drop(columns='b')
)
df

2.2 利用case_when()方法实现多条件分支
pyjanitor中的case_when()方法可以帮助我们针对数据框实现类似SQL中的的多条件分支运算,注意,因为是多条件分支,所以包含最后的“其他”条件在内,需要至少定义3条分支规则,参考下面的例子:
df = pd.DataFrame(
{
"a": [0, 0, 1, 2],
"b": [0, 3, 4, 5],
"c": [6, 7, 8, 9],
}
)
df.case_when(
((df.a == 0) & (df.b == 0)), '类别1',
((df.a == 0) & (df.b != 0)), '类别2',
# 其他情况
'类别3',
column_name="类别",
)

2.3 利用conditional_join()实现条件连接
pyjanitor中的conditional_join()非常地好用,它弥补了pandas一直以来都未完善的“条件连接”功能,即我们对两张表进行连接的条件,不只pandas中的merge()、join()之类的方法所实现的,左表与右表的指定字段之间相等这样简单的条件判断,而是可高度自定义的条件判断。
conditional_join()在作为方法使用时,其第一个参数应传入连接中的右表数据框,紧接着的是若干个格式为(左表字段, 右表字段, 判断条件)这样的三元组来定义单条或多条条件判断的且组合,之后再用于定义连接方式how参数。
下面是一个示例,这里我们实现生信中常见的一种数据分析操作,左表和右表各自定义了一些区间段,我们利用条件连接来为左表找到右表中完全被其包住的区间:
# 定义示例左表
df_left = pd.DataFrame({
'id': list('abcd'),
'left_range_start': [2, 9, 14, 30],
'left_range_end': [5, 11, 21, 35]
})
# 定义示例右表
df_right = pd.DataFrame({
'id': list('ijxy'),
'right_range_start': [2, 6, 15, 28],
'right_range_end': [3, 10, 18, 31]
})

进行条件连接:
(
df_left
.conditional_join(
df_right,
# 满足left_range_start <= right_range_start
('left_range_start', 'right_range_start', '<='),
# 且满足left_range_end >= right_range_end
('left_range_end', 'right_range_end', '>=')
)
)
连接结果如下:

2.4 利用move()方法快捷完成字段位置调整
pyjanitor中的move()方法用于快捷调整某行或某列数据的位置,通过source参数指定需要移动的数据行index或列的字段名,target参数用于指定移动的目标位置数据行index或列的字段名,position用于设置移动方式('before'表示移动到目标之前一个位置,after表示后一个位置),axis用于设定移动方式(0表示行移动,1表示列移动)。
以最常用的列移动为例:

而除了上述这些颇具特色的功能外,pyjanitor中还针对生信、化学、金融、机器学习、数学等领域内置了一些特别的功能,感兴趣的朋友可以前往其官网https://pyjanitor-devs.github.io/pyjanitor/进一步了解相关内容。
以上就是本文的全部内容,欢迎在评论区与我进行讨论~
(数据科学学习手札134)pyjanitor:为pandas补充更多功能的更多相关文章
- (数据科学学习手札63)利用pandas读写HDF5文件
一.简介 HDF5(Hierarchical Data Formal)是用于存储大规模数值数据的较为理想的存储格式,文件后缀名为h5,存储读取速度非常快,且可在文件内部按照明确的层次存储数据,同一个H ...
- (数据科学学习手札73)盘点pandas 1.0.0中的新特性
本文对应脚本及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 毫无疑问pandas已经成为基于Pytho ...
- (数据科学学习手札97)掌握pandas中的transform
本文示例文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 开门见山,在pandas中,transform是 ...
- (数据科学学习手札99)掌握pandas中的时序数据分组运算
本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们在使用pandas分析处理时间序列数据 ...
- (数据科学学习手札69)详解pandas中的map、apply、applymap、groupby、agg
*从本篇开始所有文章的数据和代码都已上传至我的github仓库:https://github.com/CNFeffery/DataScienceStudyNotes 一.简介 pandas提供了很多方 ...
- (数据科学学习手札72)用pdpipe搭建pandas数据分析流水线
1 简介 在数据分析任务中,从原始数据读入,到最后分析结果出炉,中间绝大部分时间都是在对数据进行一步又一步的加工规整,以流水线(pipeline)的方式完成此过程更有利于梳理分析脉络,也更有利于查错改 ...
- (数据科学学习手札47)基于Python的网络数据采集实战(2)
一.简介 马上大四了,最近在暑期实习,在数据挖掘的主业之外,也帮助同事做了很多网络数据采集的内容,接下来的数篇文章就将一一罗列出来,来续写几个月前开的这个网络数据采集实战的坑. 二.马蜂窝评论数据采集 ...
- (数据科学学习手札40)tensorflow实现LSTM时间序列预测
一.简介 上一篇中我们较为详细地铺垫了关于RNN及其变种LSTM的一些基本知识,也提到了LSTM在时间序列预测上优越的性能,本篇就将对如何利用tensorflow,在实际时间序列预测任务中搭建模型来完 ...
- (数据科学学习手札80)用Python编写小工具下载OSM路网数据
本文对应脚本已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们平时在数据可视化或空间数据分析的过程中经常会 ...
随机推荐
- Programiz C 语言教程·翻译完成
原文:Programiz 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远. 在线阅读 ApacheCN 学习资源 目录 C 简介 C 关键字和 ...
- .NET Core分析程序集最优美的方法,不用Assembly.LoadFile(),超越ReflectionOnlyLoad
在编写.NET程序的时候,如果需要对一个程序集文件进行分析,我们可以使用Assembly.LoadFile()来加载这个程序集,然后对LoadFile()方法返回的Assembly对象进行进一步的分析 ...
- X000100
P3172 [CQOI2015]选数 gcd 为 \(K\) 不太好办,所以我们先把它转化成 gcd 为 1 的问题: scanf("%d%d%d%d",&n,&k ...
- Kubernetes:Pod总结(二)
Blog:博客园 个人 承接上文. 在实际的生产使用场景中,直接用 Pod 是不合适的,因为必然会产生单点故障.因此,我们需要有一种方法来方便地创建.管理同一个服务的多个实例 Pod.Kubernet ...
- 一次SQL查询优化原理分析(900W+数据,从17s到300ms) (转)
有一张财务流水表,未分库分表,目前的数据量为9555695,分页查询使用到了limit,优化之前的查询耗时16 s 938 ms (execution: 16 s 831 ms, fetching: ...
- LeetCode随缘刷题之回文数
package leetcode.day_01_30; /** * 给你一个整数 x ,如果 x 是一个回文整数,返回 true :否则,返回 false . * <p> * 回文数是指正 ...
- 帆软报表(finereport)图表操作细节
图表间之间的组件间隔:body-->属性-->布局-->组件间隔 决策报表背景水印:body-->属性-->水印 仪表盘指针/枢纽/背景颜色:样式-->系列 柱形图 ...
- 帆软报表(finereport)JS实现点击参数面板按钮显示或隐藏数据
当报表中列出数据太多时,想通过显示按钮隐藏明细数据只显示统计数据.如下图示例,那么该如何实现呢?本文以FineReport为例,来讲述JS如何实现点击参数面板按钮显示或隐藏数据. 打开报表 在参数面板 ...
- 读写分离&分库分表学习笔记
读写分离 何为读写分离? 见名思意,根据读写分离的名字,我们就可以知道:读写分离主要是为了将对数据库的读写操作分散到不同的数据库节点上. 这样的话,就能够小幅提升写性能,大幅提升读性能. 我简单画了一 ...
- EMNLP 2017 | Sparse Communication for Distributed Gradient Descent
通过将分布式随机梯度下降(SGD)中的稠密更新替换成稀疏更新可以显著提高训练速度.当大多数更新接近于0时,梯度更新会出现正偏差,因此我们将99%最小更新(绝对值)映射为零,然后使用该稀疏矩阵替换原来的 ...