Код ниже создает результат в первой таблице. Однако я не могу заставить его оценить значение истинности в столбце pos2
перед выполнением требуемого вычисления для столбца d
. Важно, чтобы все сгруппированные значения (идентифицируемые одним и тем же номером в столбце grp2
) имели значение True, а также в столбце pos2
перед выполнением расчета.
threshold = 90
df['pos2'] = abs(df.deviation) >= 0.05
df['grp2'] = (df['pos2'] != df['pos2'].shift()).cumsum()
s=df.grp2.diff().ne(0).cumsum()
s1=s.groupby(s).transform('count')
s2=s.groupby(s).cumcount()
df['select2']=((s1==s2+1)&(s1>threshold)).astype(int)
df['d']=(df.select2.mask(df.select2==0)*1).ffill(limit=3).combine_first(df.select2)
из которых выход:
af a deviation pos2 grp2 select2 d
0 50.033 NaN -0.033 False 1 0 0.0
1 50.025 -0.008 -0.025 False 1 0 0.0
2 49.979 -0.046 0.021 False 1 0 0.0
3 49.954 -0.025 0.046 False 1 1 1.0
4 49.935 -0.019 0.065 True 2 0 1.0
5 49.935 0.000 0.065 True 2 0 1.0
6 49.930 -0.005 0.070 True 2 0 1.0
268173 50.058 -0.005 -0.058 True 2840 0 0.0
268174 50.052 -0.006 -0.052 True 2840 0 0.0
268175 50.053 0.001 -0.053 True 2840 0 0.0
268176 50.056 0.003 -0.056 True 2840 1 1.0
268177 50.050 -0.006 -0.050 False 2841 0 1.0
268178 50.050 0.000 -0.050 False 2841 0 1.0
268179 50.057 0.007 -0.057 True 2842 0 1.0
И я бы хотел, чтобы это было
af a deviation pos2 grp2 select2 d
0 50.033 NaN -0.033 False 1 0 0.0
1 50.025 -0.008 -0.025 False 1 0 0.0
2 49.979 -0.046 0.021 False 1 0 0.0
3 49.954 -0.025 0.046 False 1 1 0.0
4 49.935 -0.019 0.065 True 2 0 0.0
5 49.935 0.000 0.065 True 2 0 0.0
6 49.930 -0.005 0.070 True 2 0 0.0
268173 50.058 -0.005 -0.058 True 2840 0 0.0
268174 50.052 -0.006 -0.052 True 2840 0 0.0
268175 50.053 0.001 -0.053 True 2840 0 0.0
268176 50.056 0.003 -0.056 True 2840 1 1.0
268177 50.050 -0.006 -0.050 False 2841 0 1.0
268178 50.050 0.000 -0.050 False 2841 0 1.0
268179 50.057 0.007 -0.057 True 2842 0 1.0
Было проще, чем ожидалось, просто изменить эту строку на:
df['select2']=((s1==s2+1)&(s1>threshold)&(df['pos2'] == True)).astype(int)