Pandas:当值相互依赖并基于先验值时,向量化 for 循环?

Pandas: Vectorize for loop when values are interdependent and based on prior values?

由于for循环对于几Mb的数据需要这么长的时间,我必须通过向量化来优化程序。但是我还没有找到任何好的解决方案,如下所示。

data = {'A':[0,0,1,0,1,0,0,0,0],
       'B':[0,1,0,0,0,0,0,1,1]}
df = pd.DataFrame(data)

df['C'] = 0
df['D'] = 0

# for loop updating column C&D 
for i in df.index:
    df.loc[i,'D'] = 0 if (df.loc[i,'B'] == 0) else df.shift().loc[i,'C'] if (df.shift().loc[i,'C'] != 0) else 0
    df.loc[i,'C'] = df.loc[i,'A'] if (df.loc[i,'A'] != 0) else 0 if (df.loc[i,'D'] != 0) else df.shift().loc[i,'C']

我想找到最有效的方法来更新上面的 C 列和 D 列。

想要的结果可以如下所示:

   A  B    C    D
0  0  0  NaN  0.0
1  0  1  0.0  NaN
2  1  0  1.0  0.0
3  0  0  1.0  0.0
4  1  0  1.0  0.0
5  0  0  1.0  0.0
6  0  0  1.0  0.0
7  0  1  0.0  1.0
8  0  1  0.0  0.0

注意事项:

1. C和D相互依存

2。 C和D是根据上一行计算的

希望迭代不是唯一的方法,尽管它看起来是。

df.shift() 为每次迭代移动整个数据帧,这是非常低效的。除此之外 loc 往往很慢。你可以做一次。事实上,你不需要创建一个新的数据帧,你可以将结果存储在临时变量中或使用 i-1 (带条件)。请注意,thr CPython interpreter 几乎没有进行任何优化,因此重复的表达式会被重新计算很多次。也就是说,Pandas/Numpy 直接索引非常慢,使用 Numba 这样的代码会快得多。请注意,Numba 不支持 Pandas,因此您必须在调用 Numpy 函数之前将列转换为 Numpy 数组,例如 df['A'].to_numpy()