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

Python 碎片

共 3812字,需浏览 8分钟

 ·

2022-11-08 18:55

前面的文章介绍过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': [135], 'Col-2': [579]})
print(df)
res = df.pipe(np.square)
print('-'*30'\n', res, sep='')
   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

当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='')
------------------------------
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

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

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


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

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

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

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


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

使用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='')
------------------------------
Col-1 Col-2
0 12 60
1 28 108
2 60 172


写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='')
------------------------------
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


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


浏览 33
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报