看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
链式方法是当前比较流行的一种语法规则,本文将介绍链式方法的思想,有什么好处,Pandas 如何使用链式方法。关于链式方法的优点,在作者的新书《深入浅出Pandas》第 17.1.1 章节(p.360)有详细的介绍,其中包括了编写方法,解决需求的思路等内容,教你写出「pandastic」的代码。
pandas 的链式编写方法是利用 pandas 的面向对象特性,下一个方法或者操作对上一个对象应用相关方法的过程。形式如:
# 长注释
df.<method1>.<method1>.<method2>.<method3>.<methodN>
为了方便阅读,也可以写成如下形式:
(
df.<method1> # 短注释
.<method1> # 短注释
# 长注释
.<method2>
.<...>
..<methodN>
)
可以通过下文的 DEMO 理解,也可以通过 Pandas 分析近100年圣诞节的星期分布 这个案例理解。
这种方法是基于我们日常对数据处理过程的,每个方法对会前边已经处理好的数据进行进一步的操作,与我们实际处理数据的思路相同,因此编码之前只要做好处理步骤的规划就能快速进入编码阶段,此思考过程也在我的《深入浅出Pandas》书中有详细介绍。
总结其优点有以下几点:
一:
(df.groupby('team')
.sum()
.assign(Q1Q2=lambda x: x.Q1+x.Q2)
.Q1Q2
.plot()
)
二:
(
pd.concat(pd.read_csv('data1.csv'), pd.read_csv('data2.csv'))
.fillna(...)
.append(...)
.set_index('...')
.query('some_condition')
.assign(new_column = pd.cut(...))
.eval('...')
.pivot_table(...)
.pipe(fun) # 应用管道方法
.rename(...) # 修改轴名
.loc[lambda x: ...] # 筛选
.mask(df.A>=2,1) # 修改数据
.plot # 绘图
.line(...)
)
使用链式方法时,有以下问题:
由于以上原因,不能享用代码提示和代码补全功能,因此我提供了一种解决方案:
在每个操作代码中均使用 pipe 管道方法调用函数,函数为匿名函数,变量使用 s 代表 Series,d 代表 DataFrame,在使用这两个变量前,对 s 和 d 分别进行 Series 和 DataFrame 对象赋值。
在编写代码时会认为是这两个对象,代码编辑器会进行代码提示和补全,但在执行时 s 和 d 它们又是 lambda 的局部变量,会正确执行逻辑代码。
见以下代码示例,在编写过程中会做代码提示:
import pandas as pd
s = pd.Series
d = pd.DataFrame
df = pd.read_csv('https://gairuo.com/file/data/team.csv')
(
df.set_index('name')
.pipe(lambda d: d.assign(total=d.sum(1, numeric_only=True)))
.pipe(lambda d: d.assign(avg=d.total/4))
.avg
.pipe(lambda s: s.add(10))
.pipe(lambda s: s.max())
)
这样就巧妙地解决了这个问题。
以上在 VS code 中的效果。
更新时间:2022-04-21 08:17:52 标签:pandas 链式方法