Python pandas:平庸应用语句非常慢

时间:2015-08-03 11:03:46

标签: python pandas dataframe numba

我有一个带有大约的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秒会过度。

谢谢!

1 个答案:

答案 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)