(关注上方公众号,发送‘资料’二字,免费获取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 方法。
否则,矢量化总是更好的,因为它更快。
请长按或扫描关注本公众号
领取专属 10元无门槛券
私享最新 技术干货