作者:king | 来源:互联网 | 2023-07-05 12:07
1.概述
在操作Series或者DataFrame级别数据时,例如修改、删除等,需要用到一些特别的函数,常用的有下面几个:
1.apply():以DataFrame的行或列为单位(由axis参数决定),操作数据。
2.applymap():操作DataFrame中的每个元素。
3.map():操作Series,或者DataFrame中某一列的元素。
4.pipe():操作整个DataFrame或者 Series中的所有元素。
2.pipe介绍
相对来说,前面三个函数理解起来,相对较为容易。最不好理解的是pipe()函数。下面重点讲讲pipe函数。先看官方文档描述:
DataFrame.pipe(func, *args, **kwargs)
func:function
Function to apply to the Series/DataFrame. args
, and kwargs
are passed into func
. Alternatively a (callable, data_keyword)
tuple where data_keyword
is a string indicating the keyword of callable
that expects the Series/DataFrame.
args:iterable, optional
Positional arguments passed into func
.
kwargs:mapping, optional
只看上面文档不是很好理解。通俗点来说:
df.pipe(f, *args, **kwargs)
效果等同于f(df, *args, **kwargs)
3.pipe()用法
那采用pipe()函数有什么好处?好处就是可以链式编程。来点实际的例子,先构建数据:
import pandas as pd
import numpy as npdf = pd.DataFrame(np.arange(12).reshape(3,4))
df
再写两个自定义函数:
#所有元素加n
def add_n(df,n):df2=df.applymap(lambda x:x+n)return df2
#所有元素减n
def minus_n(df,n):df2=df.applymap(lambda x:x-n)return df2
然后用pipe函数调用:
df.pipe(add_n,10).pipe(minus_n,5)
结果如下:
也就先加10,再减5的结果。这种连续调用的方式就是链式编程,在以前的jQuery中经常使用,可以降低代码的复杂度。但是上面代码还可以改进下:
(df.pipe(add_n,10).pipe(minus_n,5)
)
采用缩进的方式,让代码可读性更强。但是为什么要加个括号呢?官方文档上也有解释:
Expressions in parentheses, square brackets or curly braces can be split over more than one physical line without using backslashes.
大意是:括号、方括号或大括号中的表达式可以拆分为多个行,而无需使用反斜杠。也就是说加了一个括号过后,括号内的代码就不受“空格缩进”的约束。
4.pipe()传入数据到指定的参数
上面的函数add_n、minus_n默认第一个参数就是需要传入的Series或者DataFrame数据,那可不可以作为第二个,或者任意位置的参数,将Series或者DataFrame数据传进去呢?下面再写一个函数:
def append_df_n(df1,df2,n):df3=df1.applymap(lambda x:x-n)return df3.append(df2)
可以看出,append_df_n函数有两个可以接受DataFrame数据的参数,我们试着把pipe()调用的结果传给第二个参数。
(df.pipe(add_n,10).pipe((append_df_n,"df2"),df1=df,n=6)
)
上面代码的意思是:把pipe(add_n,10)返回的数据传给append_df_n函数的df2参数,df1与n另外单独传入。结果如下:
前三条数据是df减去6的结果,后三条数据是df加上10的结果。当然pipe(add_n,10)返回的数据也可以传给df1参数:
(df.pipe(add_n,10).pipe((append_df_n,"df1"),df2=df,n=6)
)
结果如下:
那么前三条数据的意思是:df先加10,再减6的结果。
5.总结
pipe()函数的作用主要是用于链式编程,降低连续调用函数的代码复杂度,提高代码可读性。 如果我们只对Series或者DataFrame数据操作一次,那么应该采用apply()、applymap()、 map()函数。
如果把apply()、applymap()、 map()看作是一维空间的操作,那么pipe()就相当于二维空间的操作,它可以把所有的apply()、applymap()、 map()操作放在自定义函数里面,通过链式编程的方式实现统领作用。