目前,我正在使用一个条件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)
将在第一行放置一个零—因为它没有前面的值可以放置。