pandas管道函数pipe

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 np

df = 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()操作放在自定义函数里面,通过链式编程的方式实现统领作用。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值