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/