测试真值多列

时间:2019-05-18 17:17:13

标签: python pandas dataframe

下面的代码在第一个表中创建结果。但是,在对列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)

0 个答案:

没有答案