zoukankan      html  css  js  c++  java
  • 在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)
    )
    

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


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

  • 相关阅读:
    【STSRM12】整除
    【STSRM12】夏令营
    【BZOJ】1954: Pku3764 The xor-longest Path
    Faster-rcnn实现目标检测
    反向传播算法的理解
    人工智能发展的看法
    FCN的理解
    卷积神经网络的部分知识理解
    不常见算法的介绍
    如何对模型进行优化
  • 原文地址:https://www.cnblogs.com/feffery/p/13941809.html
Copyright © 2011-2022 走看看