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)
我有一个 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)