在pandas中使用pipe()提升代码可读性

简介: 在pandas中使用pipe()提升代码可读性

1 简介

我们在利用pandas开展数据分析时,应尽量避免过于「碎片化」的组织代码,尤其是创建出过多不必要的「中间变量」,既浪费了「内存」,又带来了关于变量命名的麻烦,更不利于整体分析过程代码的可读性,因此以流水线方式组织代码非常有必要。

图1

而在以前我撰写的一些文章中,为大家介绍过pandas中的eval()query()这两个帮助我们链式书写代码,搭建数据分析工作流的实用API,再加上下面要介绍的pipe(),我们就可以将任意pandas代码完美组织成流水线形式。

2 在pandas中灵活利用pipe()

pipe()顾名思义,就是专门用于对SeriesDataFrame操作进行流水线(pipeline)改造的API,其作用是将嵌套的函数调用过程改造为「链式」过程,其第一个参数func传入作用于对应SeriesDataFrame的函数。

具体来说pipe()有两种使用方式,「第一种方式」下,传入函数对应的第一个位置上的参数必须是目标SeriesDataFrame,其他相关的参数使用常规的「键值对」方式传入即可,就像下面的例子一样,我们自编函数对「泰坦尼克数据集」进行一些基础的特征工程处理:

import pandas as pd
train = pd.read_csv('train.csv')
def do_something(data, dummy_columns):
    '''
    自编示例函数
    '''
    data = (
        pd
        # 对指定列生成哑变量
        .get_dummies(data, # 先删除data中指定列
                     columns=dummy_columns,
                     drop_first=True)
    )
    
    return data
# 链式流水线
(
    train
    # 将Pclass列转换为字符型以便之后的哑变量处理
    .eval('Pclass=Pclass.astype("str")', engine='python')
    # 删除指定列
    .drop(columns=['PassengerId', 'Name', 'Cabin', 'Ticket'])
    # 利用pipe以链式的方式调用自编函数
    .pipe(do_something, 
          dummy_columns=['Pclass', 'Sex', 'Embarked'])
    # 删除含有缺失值的行
    .dropna()
)

可以看到,在紧接着drop()下一步的pipe()中,我们将自编函数作为其第一个参数传入,从而将一系列操作巧妙地嵌入到链式过程中。

「第二种使用方式」适合目标SeriesDataFrame不为传入函数第一个参数的情况,譬如下面的例子中我们假设目标输入数据为第二个参数data2,则pipe()的第一个参数应以(函数名, '参数名称')的格式传入:

def do_something(data1, data2, axis):
    '''
    自编示例函数
    '''
    data = (
        pd
        .concat([data1, data2], axis=axis)
    )
    
    return data
# pipe()第二种使用方式
(
    train
    .pipe((do_something, 'data2'), data1=train, axis=0)
)

在这样的设计下我们可以避免很多函数嵌套调用方式,随心所欲地优化我们的代码~

目录
相关文章
|
存储 关系型数据库 MySQL
达梦(DM)数据迁移工具
讲述达梦数据库迁移工具使用
|
调度 Windows
|
存储 大数据 数据中心
提升数据中心能效的先进冷却技术
【5月更文挑战第27天】 在信息技术不断进步的今天,数据中心作为计算和存储的核心枢纽,其能源效率已成为评价其可持续性的关键指标。本文将探讨当前数据中心面临的热管理挑战,并展示一系列创新的冷却技术解决方案,旨在提高数据中心的能效,同时确保系统的稳定性和可靠性。通过对比传统冷却方法和新兴技术,我们将分析各种方案的优势、局限性以及实施难度,为数据中心运营者提供科学的决策参考。
|
开发者 Python
使用python打印异常
Python的try-except用于异常处理,尝试执行try块中的代码,若出现异常,则由except捕获并处理。示例展示了当尝试除以零引发`ZeroDivisionError`时,如何打印异常信息。使用`traceback`模块可获取更详尽的异常堆栈信息。在实际应用中,异常信息应根据需求写入日志或发送给开发者,避免向用户暴露敏感信息。
154 0
|
设计模式 缓存 Java
就因为把int改成Integer,第2天被辞了
一个程序员就因为改了生产环境上的一个方法参数,把int型改成了Integer类型,因为涉及到钱,结果上线之后公司损失惨重,程序员被辞退了。信不信继续往下看。先来看一段代码:
130 0
|
4天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
292 116
|
19天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~