我有一个包含约250,000行的pandas数据框。我正在尝试创建一个新字段,如下所示:
df['new_field'] = df.apply( lambda x: x.field2 if x.field1 > 0 else 0, axis =1 )
这段代码可以运行,但是上面的一行需要大约15秒才能运行完毕!
我对其进行了优化:
@numba.jit(nopython=True)
def mycalc(field1, field2, out):
for i in xrange(field1.size):
if field1[i] > 0:
out[i] = field2[i]
else:
out[i] = 0
return out
df['new_field'] = mycalc(df.field1.as_matrix(), df.field2.as_matrix(), np.zeros(df.field1.size) )
现在它只需要0.25秒。
我的问题是:有没有更好的方法?
Numba解决方案的时间控制良好,但整个方法似乎有些奇怪:我希望一个平凡的计算可以在一行中高效地完成。此外,在nopython模式下使用numba时,我需要在numba之外初始化输出数组并将其传递给numba,因为我了解到numba不能在nopython模式下创建新数组。
其中一些数据来自SQL,我发现我最好尽可能多地在SQL中处理数据,因为速度差异太大了。当然,我理解在处理GB级数据时SQL会更快,但在250k行上进行如此普通的计算需要15秒,这显然过长。
谢谢!