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()
。
由于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()
。