下面的代码在第一个表中创建结果。但是,在对列pos2
执行所需的计算之前,我无法获得它来评估列d
中的真值。重要的是,在进行计算之前,所有分组的值(在列grp2
中由相同的数字标识)在列pos2
中也为True。
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)