Python pandas:普通的apply语句运行极慢

3

我有一个包含约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秒,这显然过长。

谢谢!

1个回答

4
您可以使用np.where
df['new_field'] = np.where(df['field1'] > 0, df['field2'], 0)

所以上述代码测试布尔条件并在True时返回df ['field2'],否则返回0
或者按照pandas的风格:
df['new_field'] = df['field2'].where(df['field1'] >0, 0)

谢谢!对于更复杂的情况,其中矢量化如果不是不可能的话,您会推荐numba还是其他什么? - Pythonista anonymous
可能的话,进行性能分析以查看是否值得做。 - EdChum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接