numpy 更新pandas列比for循环快

mrphzbgm  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(73)

我需要用一个额外的比较来更新一个框架列。我用一个for循环来处理这个问题,

import pandas as pd

df = pd.DataFrame({'Signal':[1,1,1,0,0,0,0,0,0,1],'F1':[5,5,5,5,5,5,5,5,5,5],'F2':[5,5,5,5,5,6,4,4,4,4]}) 

for i in range(1,len(df)):
    if (df['Signal'].iloc[i-1] == 1) & (df['F1'].iloc[i]<=(df['F2']).iloc[i]):
        df['Signal'].iloc[i] = 1

for循环检查之前的状态,然后检查我的条件并更新“Signal”列。在一个只有几千行的嵌套框架中,这个操作开始比我希望的要多。我希望优化代码,但不知道如何。
到目前为止,我有这个列表理解,它给予了我更新的值,但不是我应该更新的位置。也不确定它是否比我的循环更快的解决方案

[1 for i in range(1,len(df)) if (df['Signal'].iloc[i-1] == 1) & (df['F1'].iloc[i]<=(df['F2']).iloc[i]) ]
zpgglvta

zpgglvta1#

验证码

cond1 = df['F1'] <= df['F2']
grp = cond1.ne(cond1.shift()).cumsum()
s1 = df['Signal']
cond2 = (s1.eq(1) | s1.shift().eq(1))
s2 = cond2.where(cond2).groupby(grp).ffill().fillna(0).astype('int')
df.assign(Signal=s1.mask(cond1, s2))

产出:

Signal  F1  F2
0   1   5   5
1   1   5   5
2   1   5   5
3   1   5   5
4   1   5   5
5   1   5   6
6   0   5   4
7   0   5   4
8   0   5   4
9   1   5   4

相关问题