【转】五种Pandas循环方法效率对比

【Python效率】五种Pandas循环方法效率对比

PS:有人提到一个问题很好,如果每次循环都采用比较复杂的操作似乎用向量化很难实现,我的建议是尽可能拆分成向量化操作,如果不行建议用numpy硬写然后用numba包加速。

正文:

如果你使用过Python及Pandas,那么你很有可能已经使用了for循环去进行某些数据分析操作。不幸的是,绝大部分Python新手使用的下标循环语句实际上是非常之慢的,即便在小数据集上也会消耗大量的运行时间。本专栏之前的一些文章已经涉及了这方面的讨论,在这篇文章中文兄进一步特意对五种不同的For Loop方法进行横向对比,使大家更加明晰自己平时写的各种For循环到底效率几何。

注意:之后代码里出现的df是一个只有一个column叫做test的dataframe。另外各方法下面的代码均只是用法举例,并不和测试速度用的代码完全一致。测试代码原文如下:

https://towardsdatascience.com/how-to-make-your-pandas-loop-71-803-times-faster-805030df4f06​towardsdatascience.com

方法1:下标循环(速度等级: )

df1 = df
for i in range(len(df)):
    if df.iloc[i]['test'] != 1:
        df1.iloc[i]['test'] = 0

下标循环是通过循环一个下标数列,通过iloc去不断get数据,这个方法是新手最常用的但也是最慢的,在测试例子中大概需要21.9s。

方法2:Iterrows循环 (速度等级: )

i = 0
for ind, row in df.iterrows():
    if row['test'] != 1:
        df1.iloc[i]['test'] = 0
    i += 1

该循环方式是通过iterrows进行循环,ind和row分别代表了每一行的index和内容。测试例子大概需要0.07s,比起下标循环速度提升了321倍。

方法3:Apply循环(速度等级: )

df1['test'] = df['test'].apply(lambda x: x if x == 1 else 0)

Apply是pandas的一个常用函数,通常的用法是内接一个lambda匿名函数,从而对dataframe的每一行都进行循环处理。在测试例子中,apply的速度为0.027s,比下标循环快了811倍。

方法4:Pandas内置向量化函数(速度等级: )

res = df.sum()

Pandas为我们提供了大量的内置向量化函数,比如sum,mean就可以快速计算某一列的求和和平均。在测试例子中速度为0.00236s,比下标循环快了9280倍。

方法5:Numpy向量化函数(速度等级: )

df_values = df.values
res = np.sum(df_values)

最后一种方法是将Pandas的数据转化为Numpy的Array,然后使用Numpy的内置函数进行向量化操作。在测试例子中速度为0.000305s,比下标循环快了71800倍。

下面是详细的速度对比图,来自之前链接:

Sources:

[1] https://stackoverflow.com/questions/52673285/performance-of-pandas-apply-vs-np-vectorize-to-create-new-column-from-existing-c
[2] https://en.wikipedia.org/wiki/Locality_of_reference

猜你喜欢

转载自blog.csdn.net/weixin_52071682/article/details/115148961