如何对pandas数据框计算进行矢量化,如果不满足条件,则输入前一行的数据?



目前,我正在使用一个条件for循环,当true执行计算并将其输入到数据框的列中。但是,如果不满足条件,则将前一行的数据输入到新行中。

这是我目前拥有的伪代码:


for index in range(len(dataframe[column1])):
if condition==True:
dataframe.at[index, column3]= dataframe.at[index, column1]-dataframe.at[index, column2]
else:
dataframe.at[index, column3]= dataframe.at[index-1, column3]

我理解当当前行的计算依赖于前一行时,向量化通常是不可行的。然而,在这种情况下,由于第3列的计算不依赖于前一行,我只是将前一行的值输入到当前行,是否有可能将其矢量化以提高运行时速度?

你可以像这样用矢量化的方式来做。

<<p>开始数据/strong>
c0  c1  c2
0   5   2   4
1   5  10   6
2   9   3   2
3   1   4   2
4   4   2   7
5   1   5   8
6   3   4   6
7  10   1   3
8   4   2   6
9   3   1   2

import numpy as np
dfc = df.assign(c3=np.where(df['c0']>2, df['c1']-df['c2'], np.nan)).ffill().fillna(0).astype(int)
print(dfc)

结果

c0  c1  c2  c3
0   5   2   4  -2
1   5  10   6   4
2   9   3   2   1
3   1   4   2   1
4   4   2   7  -5
5   1   5   8  -5
6   3   4   6  -2
7  10   1   3  -2
8   4   2   6  -4
9   3   1   2  -1

这利用Numpy的where函数来进行选择。如果条件为真,就进行减法。如果不为真,则将NA值临时放入单元格中。然后ffill做值的前向填充,完成将列的前一个值放入单元格的逻辑,如果条件不为真。注意,如果第一行不满足条件,fillna(0)将在第一行放置一个零—因为它没有前面的值可以放置。

最新更新