我有一个带有大约的pandas数据框。 250,000行。我正在尝试创建一个新字段,如下所示:
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中的表现就越多,因为速度差异很大。现在,我当然感谢SQL在处理GB数据时会更快,但对于250k行的平庸计算,15秒会过度。
谢谢!
答案 0 :(得分:4)
您可以使用np.where
:
df['new_field'] = np.where(df['field1'] > 0, df['field2'], 0)
所以上面测试你的布尔条件并在df['field2']
时返回True
否则返回0
或pandas风格:
df['new_field'] = df['field2'].where(df['field1'] >0, 0)