热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

pandas管道函数pipe

1.概述在操作Series或者DataFrame级别数据时,例如修改、删除等,需要用到一些特别的函数,常用的有下面几个:

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

 


推荐阅读
author-avatar
king
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有