• Pandas知识点-详解表级操作管道函数pipe


    Pandas知识点-详解表级操作管道函数pipe

    前面的文章介绍过Pandas中的元素级处理函数和行列级处理函数,本文介绍表级的处理函数DataFrame.pipe(),pipe()常被称为管道函数。

    pipe()参数和用法介绍

    pipe(func, *args, **kwargs):

    • func: 用于对数据进行表级处理的函数,函数可以是内置函数、库函数、自定义函数或匿名函数。
    • *args: 传递给函数func的位置参数。
    • **kwargs: 传递给函数func的关键字参数。

    返回数据:

    • 返回一个新的DataFrame。
    pipe()函数基本使用
    # coding=utf-8
    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({'Col-1': [1, 3, 5], 'Col-2': [5, 7, 9]})
    print(df)
    res = df.pipe(np.square)
    print('-'*30, '\n', res, sep='')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
       Col-1  Col-2
    0      1      5
    1      3      7
    2      5      9
    ------------------------------
       Col-1  Col-2
    0      1     25
    1      9     49
    2     25     81
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    当pipe()只对DataFrame进行一次函数处理时,它的效果等同于直接用函数对DataFrame处理:func(df),与apply()、applymap()、map()等的处理结果也一样。

    如果只对DataFrame做一次处理,建议使用apply(),pipe()函数的精髓在于对DataFrame做多次处理时,使用链式调用。

    pipe()函数链式调用

    先看如下三个函数对DataFrame的处理。

    df_one = np.square(df)
    print('-'*30, '\n', df_one, sep='')
    df_two = np.multiply(df_one, 2)
    print('-'*30, '\n', df_two, sep='')
    df_three = np.add(df_two, 10)
    print('-'*30, '\n', df_three, sep='')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    ------------------------------
       Col-1  Col-2
    0      1     25
    1      9     49
    2     25     81
    ------------------------------
       Col-1  Col-2
    0      2     50
    1     18     98
    2     50    162
    ------------------------------
       Col-1  Col-2
    0     12     60
    1     28    108
    2     60    172
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    这三个函数依次对DataFrame进行一步处理,前一个函数的输出是后一个函数的输入。

    这三个函数也可以嵌套在一起,写到一行代码中。

    result = np.add(np.multiply(np.square(df), 2), 10)
    print('-'*30, '\n', result, sep='')
    
    • 1
    • 2
    ------------------------------
       Col-1  Col-2
    0     12     60
    1     28    108
    2     60    172
    
    • 1
    • 2
    • 3
    • 4
    • 5

    函数嵌套在一起写的最终结果没有改变,功能上没有问题。

    但是可读性不高,不够Pythonic,不够优雅。如果嵌套的层数更多,甚至可能会误导读代码的人。

    遇到类似的情况,非常适合使用pipe()来链式调用,提高可读性。

    pipe_result = df.pipe(np.square).pipe(np.multiply, 2).pipe(np.add, 10)
    print('-'*30, '\n', pipe_result, sep='')
    
    • 1
    • 2
    ------------------------------
       Col-1  Col-2
    0     12     60
    1     28    108
    2     60    172
    
    • 1
    • 2
    • 3
    • 4
    • 5

    使用pipe()进行链式调用,将每个函数依次传入到pipe()中,执行完一个函数,再将结果传递给链式调用的下一个函数,pipe()就像一根管道一样。

    这样看起来不仅先后顺序一目了然,而且逻辑清晰,可读性非常高,非常优雅。

    在数据分析时,对数据做多次处理是非常正常的,这正是pipe()的最大用途。

    pipe()链式调用还有另一种写法,将所有的pipe()换行缩进对齐。

    pipe_result = (df.pipe(np.square)
                     .pipe(np.multiply, 2)
                     .pipe(np.add, 10))
    print('-'*30, '\n', pipe_result, sep='')
    
    • 1
    • 2
    • 3
    • 4
    ------------------------------
       Col-1  Col-2
    0     12     60
    1     28    108
    2     60    172
    
    • 1
    • 2
    • 3
    • 4
    • 5

    写Python代码时,在需要换行的代码外层加上括号,换行后不会报错,也不需要在换行的地方加反斜杠。此外,还可以调整代码的缩进,将代码对齐,大大提高可读性。这种方式在链式调用时经常使用。

    pipe()中func的另一种传参方式
    def add_num(num, dfx):
        df_new = dfx.add(num)
        return df_new
    
    res = df.pipe((add_num, 'dfx'), 10)
    print('-'*30, '\n', res, sep='')
    res = df.pipe((add_num, 'dfx'), num=100)
    print('-'*30, '\n', res, sep='')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    ------------------------------
       Col-1  Col-2
    0     11     15
    1     13     17
    2     15     19
    ------------------------------
       Col-1  Col-2
    0    101    105
    1    103    107
    2    105    109
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    pipe()中调用的大部分函数func的第一个参数都是接收DataFrame,所以pipe()默认将DataFrame传给func的第一个参数。

    但有一些函数不是在第一个参数接收DataFrame,如本例的add_num(num, dfx)函数,这种情况如果直接将函数func传到pipe()中,会报错。

    正确的传参语法为元组(callable, data_keyword)的形式,callable指定在pipe()中调用的函数,data_keyword指定将DataFrame传给函数的哪一个参数(用字符串指定),函数func的其他参数传递方式不变,传给*args和**kwargs。如df.pipe((add_num, ‘dfx’), 10)表示将df传递给add_num()函数的第二个位置参数dfx。

    以上就是pandas中表级操作函数pipe()的用法介绍和分析,如果本文的内容对你有帮助,欢迎点赞、收藏和评论,也可以关注和联系我一起交流讨论。

    参考文档:
    [1] pandas中文网:https://www.pypandas.cn/docs/

    相关阅读
    Pandas知识点-详解转换函数transform

  • 相关阅读:
    基于Springboot外卖系统13:实现文件上传下载模块
    MySQL与Oracle的分页
    行走在路上
    分布式文件存储 - - - MinIO从入门到飞翔
    智能服务机器人产品及解决方案
    ISS点云内部形状特征描述子
    【数据结构与算法】:带你手搓顺序表(C/C++篇)
    如何读取resources目录下的文件路径(九种方式)
    opencv3.4源码编译、安装
    【pulsar学习】pulsar架构原理
  • 原文地址:https://blog.csdn.net/weixin_43790276/article/details/127031972