【发布时间】:2019-02-06 10:58:24
【问题描述】:
我有一个数据框 - pastebin for minimium code to run
df_dict = {
'A': [1, 2, 3, 4, 5],
'B': [5, 2, 3, 1, 5],
'out': np.nan
}
df = pd.DataFrame(df_dict)
我目前正在执行以下逐行计算:
def transform(row):
length = 2
weight = 5
row_num = int(row.name)
out = row['A'] / length
if (row_num >= length):
previous_out = df.at[ row_num-1, 'out' ]
out = (row['B'] - previous_out) * weight + previous_out
df.at[row_num, 'out'] = out
df.apply( lambda x: transform(x), axis=1)
这会产生正确的结果:
A B out
0 1 5 0.5
1 2 2 1.0
2 3 3 11.0
3 4 1 -39.0
4 5 5 181.0
正确计算的细分如下:
A B out
0 1 5 0.5
out = a / b
1 2 2 1.0
out = a / b
row_num >= length:
2 3 3 11.0
out = (b - previous_out) * weight + previous_out
out = (3 - 1) * 5 + 1 = 11
3 4 1 -39.0
out = (1 - 11) * 5 + 11 = 39
4 5 5 181.0
out = (5 - (-39)) * 5 + (-39) = 181
在许多列和循环中执行此操作很慢,因此我想尽可能利用某种矢量化进行优化。
我目前的尝试是这样的:
df['out'] = df['A'] / length
df[length:]['out'] = (df[length:]['B'] - df[length:]['out'].shift() ) * weight + df[length:]['out'].shift()
这不起作用,我不太确定从这里去哪里。
Pastebin of the above code to just copy/paste into a file and run
【问题讨论】:
-
你能解释一下逻辑吗?
-
你能给出一些行的示例计算吗?例如你如何得到
181.0 -
我已经更新了示例以更好地显示逻辑和计算,并且还在更新的 pastebin 中包含了该细分
-
正如答案所说,这是一个自然循环。你可能想看看 Cython nealhughes.net/cython1
标签: python pandas numpy dataframe lambda