我有一个大约250000行的熊猫数据帧。我正在尝试创建一个新字段,如下所示:
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解决方案的时机很好,但整个方法似乎很古怪:我本希望可以在一行中高效地完成一个平庸的计算。另外,由于numba处于nopython模式,我需要在numba之外初始化输出数组并将其传递给numba,因为我知道numba无法在nopython模式下创建新数组。你知道吗
有些数据来自SQL,我用的越多,我就越觉得最好尽量用SQL,因为速度差太大了。当然,我很欣赏SQL在处理GBs的数据时会更快,但是对于25万行的普通计算来说,15秒似乎太长了。你知道吗
谢谢!你知道吗
您可以使用
np.where
:所以上面测试了布尔条件并在
True
时返回df['field2']
,否则返回0
或熊猫风格:
相关问题 更多 >
编程相关推荐