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

Python pandas: banal apply statements incredibly slow

我有一个 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,我用得越多pandas,我觉得我最好在SQL中尽可能多地做,因为速度差异是疯狂的。现在,我当然明白 SQL 在处理 GB 数据时会更快,但是 15 秒的 250k 行的平庸计算看起来过多了。

谢谢!

您可以使用 np.where:

df['new_field'] = np.where(df['field1'] > 0, df['field2'], 0)

所以上面测试你的布尔条件和 returns df['field2']True 否则它 returns 0

或 pandas 风格:

df['new_field'] = df['field2'].where(df['field1'] >0, 0)