在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('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)
)
在这样的设计下我们可以避免很多函数嵌套调用方式,随心所欲地优化我们的代码~
以上就是本文的全部内容,欢迎在评论区与我进行讨论~
作者:Feffery
出处:https://www.cnblogs.com/feffery/p/13941809.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?