首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何将 Pandas 循环加速71803倍

(关注上方公众号,发送‘资料’二字,免费获取50G人工智能视频教程!)

如果您使用 Python 和 Pandas 进行数据分析,那么很快就会接触到循环。然而,即使对于较小的 DataFames 来说,使用标准循环也是非常耗时的,对于较大的 DataFrames 来说,可能需要很长的时间。当你第一次等待超过半个小时来执行代码时,那么本文是你所需要的。

标准循环

Datatrames 是 pandas 对象,具有行和列。如果使用循环,您将遍历整个对象。Python 没有利用任何内置函数,所以速度非常慢。在本文的示例数据中,有65列和1140行,包含了2016-2019赛季的足球比赛结果。我们想要创建一个新列,用于表示某个特定的球队是否打了平局。操作如下:

因为在数据里有英超的每一场比赛,所以必须检查我们感兴趣的球队(阿森纳)是否踢球,如果是这样的话,他们是主队还是客队。正如你所看到的,这个循环非常慢,花了20.7秒来执行。让我们看看如何才能更有效率。

使用Pandas 内置函数: iterrows (),快321倍

在上一个示例中,我们循环遍历了整个 DataFrame。Iterrows ()为每一行返回一个 Series,因此它以索引对的形式遍历 DataFrame,以 Series 的形式遍历感兴趣的列。这使得它比标准循环更快:

该代码运行时间为68毫秒,比标准循环快321倍。但是,许多人建议不要使用它,因为仍然有更快的选项,而且 iterrows ()不保留行之间的 dtype。这意味着,如果您在 dataframedtypes 上使用 iterrows () ,那么可以更改它,这可能会导致很多问题。保留 dtypes,也可以使用 itertuple ()。

Apply ()方法ーー快811倍

Apply 本身并不快,但当与 DataFrames 结合使用时,就具有优势。这取决于 apply 表达式的内容。如果它可以在 Cython 空间中执行,那么 apply 要快得多(这里就是这种情况)。

我们可以在 Lambda 函数中使用 apply。我们所要做的就是指定这个轴。在这种情况下,我们必须使用 axis 1,因为我们希望执行按列操作:

这段代码甚至比以前的方法更快,完成时间为27毫秒。

Pandas矢量化速度提高9280倍

现在利用向量化的优势来创建真正快速的代码。关键是要避免像前面的例子中那样的 python 级循环,并使用内存效率更高的优化 c 代码。我们只需要稍微修改一下这个函数:

现在我们可以用 Pandas series作为输入创建新列:

在这种情况下,我们甚至不需要循环。我们所要做的就是调整函数的内容。现在可以直接将Pandas series传递给我们的功能,从而获得巨大的速度增益。

Numpy 矢量化ーー快71803倍

在前面的示例中,我们将 Pandas series传递给函数。通过添加 接收到一个 Numpy 数组:

Numpy 数组是如此之快,代码运行了0,305毫秒,比开始时使用的标准循环快了71803倍。

总结

如果您使用 Python、 Pandas 和 Numpy 进行数据分析,那么总会有一些空间可以改进您的代码。我们比较了五种不同的方法,并根据一些计算将一个新列添加到我们的 DataFrame 中。我们注意到了速度方面的巨大差异:

如果你能从这篇文章中学到两条规则,我会很高兴:

如果确定需要使用循环,则应始终选择 apply 方法。

否则,矢量化总是更好的,因为它更快。

请长按或扫描关注本公众号

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190915A09J8G00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券