作者:Gregor Scheithauer博士
翻译:王闯(Chuck)校对:欧阳锦本文约2000字,建议阅读5分钟本文介绍了如何在Python/Pandas中运用管道的概念,以使代码更高效易读。

图片来自Unsplash,JJ Ying上传

简介

我是R语言的忠实粉丝,并且靠它吃饭。特别提一下Tidyverse,它是一个功能强大、简洁易懂且文档齐全的数据科学平台。我在此向每一位初学者强烈推荐免费的在线电子书R for Data Science。

然而,我所在团队使用的编程语言却是Python/Pandas,它也是一个出色的数据科学平台。最大的区别之一(至少对我来说)是如何编写Python代码,这与R代码非常不同——这跟语法没什么直接关系。

R语言的众多优点之一是它在编程中引入了管道(pipe)的概念。这会让你的代码更具有效性和可读性。一个范例详见 Soner Yıldırım发表的帖子The Flawless Pipes of Tidyverse。

我在这里对照他的帖子,向您展示如何在Pandas中使用管道(也称方法链,method chaining)。

什么是管道?

根据R magrittr包文档[1]所述,代码中使用管道的优点如下:

  • 使数据处理的顺序结构化为从左到右(而不是从内到外);

  • 避免嵌套函数的调用;

  • 最大限度地减少对局部变量和函数定义的需求;

  • 可以轻松地在数据处理序列中的任何位置添加步骤。

不使用管道的R语言示例(请参阅[2])

下面的代码是一个典型示例。我们将函数调用的结果保存在变量中,如foo_foo_1,这样做的唯一目的就是将其传递到下一个函数调用中,如scoop()。

这导致许多变量的命名可能没那么有意义,结果增加了代码的复杂性。

 foo_foo_1 <- hop(foo_foo, through = forest)
foo_foo_2 <- scoop(foo_foo_1, up = field_mice)
foo_foo_3 <- bop(foo_foo_2, on = head)

使用管道的R语言示例(请参阅[2])

在R语言中使用管道的语法为%>%。它可以使多个函数链接起来使用。在下面的示例中,请尝试以如下方式阅读代码:

1. 我要评估/处理变量foo_foo

2. 我要foo_foo跳过森林,然后,

3. 我要foo_foo挖起田鼠,最后,

4. 我要foo_foo敲在头上

foo_foo %>%hop(through = forest) %>% scoop(up = field_mice) %>%
bop(on = head)

请注意,数据集是一个名词,而函数是动词。你现在可能理解了为什么说管道增加了代码的可读性。

为了更好地理解管道的工作方式,下面给出了解释前的代码版本:

bop(
scoop(
hop(foo_foo, through = forest),  up = field_mice  ),  on = head
)

Python/Pandas中的管道(或方法链)

由于Python中没有magrittr包,因此必须另寻他法。在Pandas中,大多数数据框函数都会返回数据集本身,我们将利用这一事实。这被称之为方法链。让我们继续以foo_foo为例。

假设我们有一段Python代码如下:

foo_foo_1 = hop(foo_foo, through = forest)
foo_foo_2 = scoop(foo_foo_1, up = field_mice)
foo_foo_3 = bop(foo_foo_2, on = head)

把它链接起来之后变成如下样子:

foo_foo.hop(through = forest).scoop(up = field_mice).bop(on = head)

已经很接近目标了,但还没到。需要做一个小调整,即用小括号()将代码括起来,使其变成我们想要得到的样子。具体样例请查看如下代码:

(  foo_foo    .hop(through = forest)  .scoop(up = field_mice).bop(on = head)
)

管道概念的优点

我喜欢这种编程风格。在我看来,引入管道概念可以带来如下优点

1. 使你的代码对于团队中的其他数据科学家(以及你自己以后阅读)而言更具可读性;

2. 或多或少避免了无意义的局部变量;

3. 可以在数据评估过程中快速添加或删除函数功能;

4. 让代码遵循你在数据评估和分析过程中的思路(遵循名词-动词范式)。

引用:R管道

[1] magrittr包:

https://magrittr.tidyverse.org/

[2] R for Data Science书中的Pipes章:

https://r4ds.had.co.nz/pipes.html?q=pipe#pipes

Python中的无缝管道(即方法链)

我将对照SonerYıldırım的文章,让您对比学习如何在R和Python中使用管道/方法链。Soner使用的是Kaggle上的Melbourne housing(墨尔本住房)数据集。你可以下载数据集,并和我一起演练一下。

读取数据集并导入相关包

 # import libs
import pandas as pd# read data
melb = pd.read_csv("../01-data/melb_data.csv")# Have a quick look at the data
(melb    .head()
)

图片来自作者

筛选,分组并生成新变量

接下来的示例对住房按距离小于2来进行筛选,按照类型进行分组,然后计算每个类型分组的平均价格。然后进行一些格式化。

( melb
.query("Distance < 2") # query equals filter in Pandas
.filter(["Type", "Price"]) # select the columns Type and Price   .groupby("Type")    .agg("mean")  .reset_index()    .set_axis(["Type", "averagePrice"], axis = 1, inplace = False)
)

图片来自作者

接下来的示例,我们将使用多个条件进行筛选并计算其他特征。请注意,可以使用内置函数agg(用于数据聚合)。就我个人而言,我通常会将assign与lambda结合使用。代码和运行结果如下。

( melb
.query("Distance < 2 & Rooms > 2")    .filter(["Type", "Price"])    .groupby("Type") .agg(["mean", "count"])  .reset_index()  .set_axis(["Type", "averagePrice", "numberOfHouses"],
axis = 1, inplace = False)    .assign(averagePriceRounded = lambda x: x["averagePrice"].round(1))
)

图片来自作者

排序

下一个示例展示了如何对不同区域(仅指以字符串South开头的区域)的住房按照平均距离来进行排序。

(   melb    .
query('Regionname.str.startswith("South")', engine = 'python')    .filter(["Type", "Regionname",
"Distance"])
.groupby(["Regionname", "Type"]) .agg(["mean"])  .reset_index()    .set_axis(["Regionname"
, "Type", "averageDistance"]
, axis = 1, inplace = False)  .sort_values(by = ['averageDistance'], ascending = False)
)

图片来自作者

为不同区域的平均距离绘制条形图

管道概念的妙处是,它不仅可以用于评估或处理数据,也可以与绘图一起使用。我个人强烈推荐绘图库plotnine - 它是Python图形语法的一个很好的实现,某种程度上说是R语言中ggplot2 包的翻版。你可以在Medium上找到更多有关plotenine的文章。

不过,如果只是想先粗略地看一下数据,Pandas plot功能则非常值得一试。

( melb  #.query('Regionname.str.startswith("South")
', engine = 'python') .filter(["Regionname", "Distance"]) .groupby(["Regionname"]) .agg(["mean"]) .reset_index() .set_axis(["Regionname", "averageDistance"],axis = 1, inplace = False)  .set_index("Regionname")  .sort_values(by = ['averageDistance'], ascending = False).plot(kind = "bar")
)

图片来自作者

使用直方图绘制价格分布

(   melb
.Price # getting one specific variable .hist()
)

图片来自作者

结语

在本文中,我鼓励大家在Python代码中使用类似R语言中的管道和方法链,以提高代码可读性和效率。我重点介绍了管道的一些优点,然后我们将这一概念应用于住房数据。我特别展示了如何进行数据读取,数据筛选和分组,计算新变量以及如何绘图。我再次安利下plotnine包,它能帮你得到更好的可视化效果。

原文标题:

The Flawless Pipes of Python/Pandas

原文链接:

https://towardsdatascience.com/the-flawless-pipes-of-python-pandas-30f3ee4dffc2

参考资料

  • Melbourne Housing Snapshot | Kaggle:https://www.kaggle.com/dansbecker/melbourne-housing-snapshot

  • Tidyverse:https://www.tidyverse.org/

  • The Flawless Pipes of Tidyverse. Exploratory data analysis made easy | by Soner Yıldırım | Mar, 2021 | Towards Data Science:ttps://towardsdatascience.com/the-flawless-pipes-of-tidyverse-bb2ab3c5399f

  • Welcome | R for Data Science (had.co.nz):https://r4ds.had.co.nz/

  • 18 Pipes | R for Data Science (had.co.nz):https://r4ds.had.co.nz/pipes.html?q=pipe#pipes

  • Data visualization in Python like in R’s ggplot2 | by Dr. Gregor Scheithauer | Medium:https://gscheithauer.medium.com/data-visualization-in-python-like-in-rs-ggplot2-bc62f8debbf5

编辑:于腾凯

校对:杨学俊

译者简介

王闯(Chuck),台湾清华大学资讯工程硕士。曾任奥浦诺管理咨询公司数据分析主管,现任尼尔森市场研究公司数据科学经理。很荣幸有机会通过数据派THU微信公众平台和各位老师、同学以及同行前辈们交流学习。

翻译组招募信息

工作内容:需要一颗细致的心,将选取好的外文文章翻译成流畅的中文。如果你是数据科学/统计学/计算机类的留学生,或在海外从事相关工作,或对自己外语水平有信心的朋友欢迎加入翻译小组。

你能得到:定期的翻译培训提高志愿者的翻译水平,提高对于数据科学前沿的认知,海外的朋友可以和国内技术应用发展保持联系,THU数据派产学研的背景为志愿者带来好的发展机遇。

其他福利:来自于名企的数据科学工作者,北大清华以及海外等名校学生他们都将成为你在翻译小组的伙伴。

点击文末“阅读原文”加入数据派团队~

转载须知

如需转载,请在开篇显著位置注明作者和出处(转自:数据派ID:DatapiTHU),并在文章结尾放置数据派醒目二维码。有原创标识文章,请发送【文章名称-待授权公众号名称及ID】至联系邮箱,申请白名单授权并按要求编辑。

发布后请将链接反馈至联系邮箱(见下方)。未经许可的转载以及改编者,我们将依法追究其法律责任。

点击“阅读原文”拥抱组织

独家 | 浅谈Python/Pandas中管道的用法相关推荐

  1. python3 nonzero_浅谈python numpy中nonzero()的用法

    nonzero函数返回非零元素的目录. 返回值为元组, 两个值分别为两个维度, 包含了相应维度上非零元素的目录值. import numpy as np A = np.mat([[0,1,2,3,4, ...

  2. python程序调用写好的代码_扣丁学堂浅谈Python编程中NotImplementedError的使用方法...

    扣丁学堂浅谈Python编程中NotImplementedError的使用方法 2018-07-04 14:08:02 2559浏览 本篇文章扣丁学堂 Python编程中raise可以实现报出错误的功 ...

  3. 浅谈verilog hdl中parameter的用法

    浅谈verilog hdl中parameter的用法 parameter 1.parameter参数使用 事例1: 事例2: 事例3 事例4 2.defparam使用 事例5 3.parameter与 ...

  4. python编程是干啥用的-浅谈Python类中的self到底是干啥的

    Python编写类的时候,每个函数参数第一个参数都是self,一开始我不管它到底是干嘛的,只知道必须要写上.后来对Python渐渐熟悉了一点,再回头看self的概念,似乎有点弄明白了. 首先明确的是s ...

  5. 计算机语言中的次方,浅谈Go语言中的次方用法

    Go语言中符号 " ^ " 不再用于次方,而是表示"按位异或的运算" 具体的运算规则如下: 按位异或 ^ : 两位一个为 0, 一个为 1 ,结果为 1 ,否则 ...

  6. 谈谈对python的理解_浅谈对python pandas中 inplace 参数的理解

    这篇文章主要介绍了对python pandas中 inplace 参数的理解,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 pandas 中 inplace 参数在很多函数中都会有, ...

  7. python中dtype什么意思_浅谈python 中的 type(), dtype(), astype()的区别

    如下所示: 函数 说明 type() 返回数据结构类型(list.dict.numpy.ndarray 等) dtype() 返回数据元素的数据类型(int.float等) 备注:1)由于 list. ...

  8. python dtype什么意思_浅谈python 中的 type(), dtype(), astype()的区别

    如下所示: 函数 说明 type() 返回数据结构类型(list.dict.numpy.ndarray 等) dtype() 返回数据元素的数据类型(int.float等) 备注:1)由于 list. ...

  9. python中astype用法_浅谈python 中的 type(), dtype(), astype()的区别

    如下所示: 函数 说明 type() 返回数据结构类型(list.dict.numpy.ndarray 等) dtype() 返回数据元素的数据类型(int.float等) 备注:1)由于 list. ...

最新文章

  1. Intellij IDEA 创建Web项目并在Tomcat中部署运行
  2. CTFshow 反序列化 web255
  3. Effective C++: noexcept
  4. Linux 进程通信 -- 信号
  5. DB2数据库添加删除约束项
  6. iview表格处理后台返回的字符串
  7. UnityGI5:实时 GI 与光探代理体
  8. linux 进程 D 状态,Linux 进程的 Uninterruptible sleep(D) 状态
  9. webstorm主题网址+使用方法
  10. vm虚拟机显卡是不是比服务器主板上的要好,自VM11起,虚拟显卡的性能是增强还是削弱?...
  11. 干扰管理学习日志4-------信道估计方法 LS(最小二乘)、MMSE(最小均方误差)
  12. Java语言,从入门到放弃
  13. 考研复试(控制工程专硕)及大学本科(物联网工程)知识点回顾(三)——模拟电子技术
  14. 压缩卷时可压缩空间远小于实际剩余空间解决方法
  15. HyperGBM之元学习器(meta_learner)
  16. 怎样架设游戏服务器 怎样搭建一个属于自己的游戏服 5分钟学会游戏架设 3D手游搭建视频教程 自己做游戏GM
  17. NG_ML_Cousera_Summary
  18. 讲师征集令 | Apache DolphinScheduler Meetup分享嘉宾,期待你的议题和声音!
  19. Python PDF转JPG
  20. 下载anaconda前需要卸载python吗_装了anaconda要卸载python吗

热门文章

  1. linux /dev/snd,linux – / dev / tcp去了哪里?
  2. 坑系列 —— 缓存+哈希=高并发?
  3. PHP 利用PHPExcel类库批量导出数据
  4. linux基础(8)-颜色显示
  5. Linux 运维笔试题(一)
  6. Java操作json的通用类
  7. 我所知道的网络管理软件
  8. iDoNews 业界报不道:大众点评最有价值的两个东西
  9. IntelliJ IDEA 12 创建Web项目 教程 超详细版
  10. windows 域的一些概念