我发现了pandas的黄金搭档!

简介: 我发现了pandas的黄金搭档!

1 简介

pandas发展了如此多年,所包含的功能已经覆盖了大部分数据清洗、分析场景,但仍然有着相当一部分的应用场景pandas中尚存空白亦或是现阶段的操作方式不够简洁方便。

今天我要给大家介绍的Pythonpyjanitor就内置了诸多功能方法,可以在兼容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表示列移动)。

以最常用的列移动为例:

目录
相关文章
lua字符串与十六进制数据转换
lua字符串与十六进制数据转换
464 2
|
人工智能 算法 决策智能
OR-tools求解器使用介绍(一)
OR-tools求解器使用介绍(一)
1347 0
|
算法
MATlAB运用——数值积分
MATlAB运用——数值积分
289 0
|
5月前
|
数据可视化 测试技术 API
Postman 是什么?(新手教程)
什么是 Postman?本文将对 Postman 进行全面介绍,让我们开始吧。
|
SQL 存储 Oracle
一次搞定各种数据库SQL执行计划
执行计划(execution plan,也叫查询计划或者解释计划)是数据库执行 SQL 语句的具体步骤,例如通过索引还是全表扫描访问表中的数据,连接查询的实现方式和连接的顺序等。如果 SQL 语句性能不够理想,我们首先应该查看它的执行计划。
一次搞定各种数据库SQL执行计划
|
运维 监控 Linux
在Linux中,如何查看所有正在运行的进程?
在Linux中,如何查看所有正在运行的进程?
|
Linux 网络安全 API
Python通过GeoIP获取IP信息(国家、城市、经纬度等)
IP地址信息是非常重要的情报信息,通过IP可以定位到该IP所在的国家、城市、经纬度等。 获取IP信息的方式有很多,很多服务商都提供了相应的地址库或API接口服务。 如国内的ipip.net,国外的ip-api.com、maxmind.com等。 很多公司都是使用Maxmind网站的IP信息库,里面包含着IP的详细信息,有付费的也有免费的,收费与免费的区别就是精准度和覆盖率。 本文介绍下载及定时更新Maxmind的离线库用python通过GeoIP来获取IP信息
913 0
|
移动开发 小程序 JavaScript
【uniapp 小程序开发页面篇】代码编写规范 | 页面编写规范 | 小程序API
【uniapp 小程序开发页面篇】代码编写规范 | 页面编写规范 | 小程序API
711 0
|
Kubernetes NoSQL 网络协议
初识 K8s,创建一个 guestbook 留言簿应用
本文介绍一个简单的 K8s 上手应用,希望通过这个简单的实践让大家对 K8s 的核心概念有更深入的理解。这个案例要在 Kubernetes 集群上部署一个名叫 guestbook 的 CURD 应用。guestbook 是 Kubernetes 社区的一个经典的应用示例,它有一个 Web 界面来让用户进行 CURD 操作,然后向一个 Redis 主节点写入数据,从多个 Redis 从节点读去数据。
|
数据采集 SQL 弹性计算
使用云服务器ECS部署了自己的第一个爬虫
云服务器部署爬虫爬取网站最新通告并推送
使用云服务器ECS部署了自己的第一个爬虫