为什么np.where比pd.apply更快

时间:2016-12-15 14:16:35

标签: python pandas numpy

示例代码在这里

import pandas as pd
import numpy as np

df = pd.DataFrame({'Customer' : ['Bob', 'Ken', 'Steve', 'Joe'],
                   'Spending' : [130,22,313,46]})

#[400000 rows x 4 columns]
df = pd.concat([df]*100000).reset_index(drop=True)

In [129]: %timeit df['Grade']= np.where(df['Spending'] > 100 ,'A','B')
10 loops, best of 3: 21.6 ms per loop

In [130]: %timeit df['grade'] = df.apply(lambda row: 'A' if row['Spending'] > 100 else 'B', axis = 1)
1 loop, best of 3: 7.08 s per loop

问题来自:https://stackoverflow.com/a/41166160/3027854

2 个答案:

答案 0 :(得分:9)

我认为np.where更快,因为使用numpy array矢量化方式并且pandas构建在此数组上。

df.apply速度很慢,因为它使用loops

vectorize操作最快,然后是cython routines,然后是apply

请参阅此answer,更好地解释一下大熊猫的开发者 - Jeff

答案 1 :(得分:1)

只需添加可视化方法即可。

df.apply的个人资料和总累计时间: df.apply profile

我们可以看到模拟时间为13.8s

np.where的个人资料和总累计时间: np.where profile

此处,累计时间为5.44ms,比2500

df.apply

上图是使用库snakeviz获得的。 Here是图书馆的链接。

  
    

SnakeViz将配置文件显示为sunburst,其中函数表示为弧。根函数是中间的圆,它调用的函数,然后是函数调用的函数,依此类推。在函数内部花费的时间量由弧的角宽度表示。围绕圆圈大部分包裹的弧表示占据其调用函数大部分时间的函数,而细线弧表示几乎不使用任何时间的函数。