25

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

 3 years ago
source link: http://www.cnblogs.com/feffery/p/13941809.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

1 简介

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

2QfAviF.png!mobile
图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)
)

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

以上就是本文的全部内容,欢迎在评论区与我进行讨论~


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK