从第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
而与之比较0
的eq
:
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
由s3
的mask
:
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] 删除。
我来说两句