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

猜你喜欢

转载自blog.csdn.net/weixin_43790276/article/details/127031972