在熊猫中设置值的最快方法

时间:2014-05-22 20:04:30

标签: python pandas

In [118]: %timeit df['A'].ix[df['Id']=='000f00003'] = 3
10 loops, best of 3: 54.9 ms per loop

In [119]: %timeit df.loc[df['Id']=='000f00003','A'] = 4
10 loops, best of 3: 55.4 ms per loop

In [126]: %timeit df.ix[df['Id']=='000f00003','A'] = 5
10 loops, best of 3: 55.8 ms per loop

我正在使用执行此设置值~20k次的操作。我试图找到比上述三个选项中更好的方法。有没有比设置变量更快的方法来设置变量呢?

我知道最快的方式是矢量化,但我不认为我可以对此进行矢量化。基本上我需要得到一个DataFrame片段(在指定时间内50微秒),找到符合我标准的行(我正在过滤的3列),然后用我找到的数据更新行,如上所述。

1 个答案:

答案 0 :(得分:0)

您似乎遇到了使用切片和条件设置缓慢设置值的问题。我碰到了类似的东西,发现使用where()运算符可以更快,更快。

当然,您不会显示您的数据,因此这可能适用也可能不适用,如果没有,我会道歉,但对于我处理的大型数据框,我看到的速度提升了2400万次!



%timeit a[np.isnan(a)]=df2
1 loops, best of 3: 1 s per loop

def time1():
    b = a.where(np.isfinite(a),df2)
    a=b

%timeit time1
10000000 loops, best of 3: 41.5 ns per loop




当我挖掘分析时,看起来不同的是第一个循环花费大量时间在 setitem 和__check__setitem__copy然后收集。当我重构我的代码以使用第二种方法时,代码的整个部分如此之快,几乎没有注册。

我认为重要的是第二种方法,尽管看起来有点愚蠢地分配给b然后回到a,将要设置的位置的识别与实际设置操作分开。这似乎是因为.where()返回与原始相同大小的整个子帧,因此可以一次性设置为原始子帧。请注意,如果您通过使用inplace = True来消除分配给b然后返回到a,那么大多数增益都会消失!

我在展示它们时简化了一些事情,但是" a"在我的应用程序和测试中实际上是多轴上的多索引切片,就像df2一样。

另外,请注意.where替换逻辑为false的位置,因此我将逻辑从np.isnan转换为np.isfinite从一个转换为另一个