Pandas是一个功能强大的开源Python库,用于数据分析,操作和可视化。 自2014年以来,我一直在教数据科学家使用pandas,从那时起,它已经越来越受欢迎,估计有500万到1000万用户,并成为Python数据科学工具包中的“必须使用”的工具。
我是在版本0.14.0左右开始使用pandas,并且我已经关注了pandas库,因为它的当前版本0.23.4已经非常成熟。 但是多年来,许多数据科学家都向我提出过这样的问题:
“Pandas可靠吗?”
“它将来会继续工作吗?”
“它有问题吗?他们甚至没有发布1.0版本!”
版本号可用于表示产品的成熟度,因此我理解为什么有人可能会犹豫是否依赖“1.0之前的”软件。 但在开源世界中,版本号并不一定能告诉你任何关于库的成熟度或可靠性的信息。(是的,Pandas库既成熟又可靠!)相反,版本号传达了API的稳定性。
特别是,版本1.0向用户发出信号:“我们已经弄清楚API应该是什么样子,因此只有主要版本(2.0,3.0等)才会发生API破坏性更改”,换句话说,版本1.0标志着代码永远不应该仅仅因为升级到下一个次要版本就导致中断。
所以问题仍然存在:Pandas1.0中会出现什么,它什么时候到来?
走向pandas 1.0
我最近观看了Pyrad London的一个名为Towards pandas 1.0的演讲,由Pandas核心开发人员Marc Garcia发表。 关于Pandas的未来,这是一个启发性的讨论,所以我想强调并评论一些提到的项目:
方法链
inplace
Apache Arrow
可拓数组
其他弃用
路线图
如果你想跟随完整的谈话幻灯片,可以在这个Jupyter notebook中找到它们。(http://nbviewer.jupyter.org/github/datapythonista/towards_pandas_1/blob/master/Towards%20pandas%201.0.ipynb)
方法链
Pandas核心团队现在鼓励使用“方法链”。 这是一种编程风格,您可以将多个方法调用链接到一个语句中。 这允许您将中间结果从一个方法传递到下一个方法,而不是使用变量存储中间结果。
以下是Marc实现的不使用方法链的示例:
以下是使用方法链的等效代码:
他们更喜欢方法链的主要原因是:
可读性:在他们看来,方法链更具可读性。
性能:由于方法链提前告诉Pandas您想要做的一切,Pandas可以更有效地规划其操作。
以下是我的想法:
多年来我一直在编写简短的方法链,我发现它们比替代方案更具可读性。 例如,我绝不会通过使用中间变量将df.isnull().sum()或ser.value_counts().sort_index()分成多行代码。
但是,我实际上发现长方法链(Marc的第二个例子)比其他方法更不易读,但也许那是因为我不习惯写它们。 具体来说,我很难搞懂assign()方法中的lambda函数。
另一位pandas核心开发者Tom Augspurger也指出:
“过长链的一个缺点是调试可能会更难。如果最后出现问题,你就没有中间值来检查。”
需要明确的是,pandas一直提供方法链,但通过添加新的“可链式”方法,对链的支持有所增加。 例如,query()方法(在上面的链中使用)之前在文档中被标记为“实验性的”,这就是为什么我没有使用它或教它。 该标签已在pandas 0.23中删除,这可能表明核心团队现在鼓励使用query()。
我认为您不会被要求使用方法链,但我认为文档最终可能会迁移到使用该样式。
有关该主题的更长时间的讨论,请参阅Tom Augspurger的Method Chaining帖子,该帖子是他的Modern pandas系列的第2部分。(https://tomaugspurger.github.io/method-chaining.html)
inplace
pandas核心团队不鼓励使用inplace参数,最终它将被弃用(这意味着“计划从库中删除”)。 原因如下:
inplace在方法链中不起作用。
与名称所暗示的相反,使用inplace通常不会阻止创建副本。
删除inplace选项会降低pandas代码库的复杂性。
就个人而言,我是inplace的粉丝,我喜欢写df.reset_index(inplace = True)而不是df = df.reset_index()。 话虽这么说,许多初学者确实对inplace感到困惑,并且在pandas中有一个明确的方法来做事,所以最终我会同意弃用inplace。
领取专属 10元无门槛券
私享最新 技术干货