互联网技术 / 互联网资讯 · 2023年10月26日 0

提高代码可读性的方法:使用pipe()函数

1. 简介

在使用pandas进行数据分析时,我们应当尽量避免将代码组织得过于「碎片化」,尤其是创建过多不必要的「中间变量」。这不仅会浪费「内存」,还可能导致变量命名混乱,从而影响代码的整体可读性。因此,以流水线的方式组织代码显得尤为重要。

在我之前的文章中,介绍过pandas中的eval()和query()这两个API,它们有助于我们以链式方式书写代码,构建数据分析工作流。而接下来要介绍的pipe()函数,可以帮助我们将任意pandas代码完美整合成流水线形式。

2. 在pandas中灵活使用pipe()

pipe()函数的名称即表明其用途:它是专为对Series和DataFrame进行流水线(pipeline)改造而设计的API。其主要功能是将嵌套的函数调用转变为「链式」的形式。其第一个参数func是要应用于相应Series或DataFrame的函数。

具体而言,pipe()有两种使用方式。在「第一种方式」中,传入函数的第一个参数必须是目标Series或DataFrame,而其他相关参数则可以通过常规的「键值对」方式传入。例如,我们可以自定义一个函数对「泰坦尼克数据集」进行一些基础的特征工程处理:

import pandas as pd train = pd.read_csv(‘train.csv’) def do_something(data, dummy_columns): ”’自定义示例函数”’ data = ( pd.get_dummies(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()中,我们将自定义函数作为第一个参数传入,从而将一系列操作巧妙地嵌入到链式过程中。

「第二种使用方式」适用于目标Series和DataFrame不作为传入函数第一个参数的情况。例如,在以下示例中,假设目标输入数据为第二个参数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) )

通过这样的设计,我们可以避免许多函数的嵌套调用,灵活地优化我们的代码。

[[[IMG_1]]]

[[[IMG_2]]]

[[[IMG_3]]]