将数字上限/阈值应用于熊猫数据框

用户名

从第1天到第7天,我有一个包含三个人(约翰,特里,亨利)的数据框。

        1     2     3     4     5     6      7
John    1.3   2.8   3.0   4.4   2.6   3.1    4.8
Terry   1.1   2.3   4.1   5.5   3.7   2.1    3.8
Henry   0.3   1.0   2.0   3.0   2.7   1.1    2.8

如何设置分数上限,使得一旦分数达到> 2.5,无论该分数是多少,从那天起所有分数都将设置为3

输出应为:

        1     2     3     4     5     6      7
John    1.3   3.0   3.0   3.0   3.0   3.0    3.0
Terry   1.1   2.3   3.0   3.0   3.0   3.0    3.0
Henry   0.3   1.0   2.0   3.0   3.0   3.0    3.0

我尝试应用首先定义一个函数并使用np.apply(threshold_1,axis = 1),但是它不起作用:

def threshold_1(x):
    if (x > 2.5 & x+1 < 2.5):
        return 3
    if (x > 2.5 & x+1 > 2.5):
        return 3
    else:
        return x
耶斯列尔

使用:

df = df.mask(df.gt(2.5).cumsum(1).gt(0), 3)
#same as
#df = df.mask((df > 2.5).cumsum(axis=1) > 0, 3)
print (df)
         1    2    3    4    5    6    7
John   1.3  3.0  3.0  3.0  3.0  3.0  3.0
Terry  1.1  2.3  3.0  3.0  3.0  3.0  3.0
Henry  0.3  1.0  2.0  3.0  3.0  3.0  3.0

详细说明

首先将2.5所有值进行比较gt

print (df.gt(2.5))
           1      2      3     4     5      6     7
John   False   True   True  True  True   True  True
Terry  False  False   True  True  True  False  True
Henry  False  False  False  True  True  False  True

然后cumsum通过按列获取axis=1

print (df.gt(2.5).cumsum(axis=1))
       1  2  3  4  5  6  7
John   0  1  2  3  4  5  6
Terry  0  0  1  2  3  3  4
Henry  0  0  0  1  2  2  3

而与之比较0eq

print (df.gt(2.5).cumsum(axis=1).gt(0))
           1      2      3     4     5     6     7
John   False   True   True  True  True  True  True
Terry  False  False   True  True  True  True  True
Henry  False  False  False  True  True  True  True

最后更换True由s3mask

print (df.mask(df.gt(2.5).cumsum(1).gt(0), 3))
         1    2    3    4    5    6    7
John   1.3  3.0  3.0  3.0  3.0  3.0  3.0
Terry  1.1  2.3  3.0  3.0  3.0  3.0  3.0
Henry  0.3  1.0  2.0  3.0  3.0  3.0  3.0 

为了提高性能,可以使用numpy

a = df.values
df1 = pd.DataFrame(np.where(np.cumsum(a > 2.5, axis=1) > 0, 3, a), 
                   index=df.index,
                   columns=df.columns)
print (df1)

         1    2    3    4    5    6    7
John   1.3  3.0  3.0  3.0  3.0  3.0  3.0
Terry  1.1  2.3  3.0  3.0  3.0  3.0  3.0
Henry  0.3  1.0  2.0  3.0  3.0  3.0  3.0

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章