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

使用pandas的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, # 先删除data中指定列 coluMns=duMMy_coluMns, dRop_fiRst=TRue) ) Return data # 链式流水线 ( tRAIn # 将PClaSS列转换为字符型以便之后的哑变量处理 .eval(””PClaSSPClaSS=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], axisaxis=axis) ) Return data # pIPe()第二种使用方式 ( tRAIn .pIPe((do_soMetHing, ””data2””), data1=tRAIn, axis=0) )

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