Tengo un dataframe con puntuaciones de tres personas (John, Terry, Henry) desde el día 1 hasta el día 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
¿Cómo puedo establecer un límite de puntaje tal que una vez que alcanza un puntaje> 2.5, todos los puntajes a partir de ese día están FIJOS sin importar cuál sea el puntaje?
La salida debe ser:
1 2 3 4 5 6 7 John 1.3 2.8 2.8 2.8 2.8 2.8 2.8 Terry 1.1 2.3 4.1 4.1 4.1 4.1 4.1 Henry 0.3 1.0 2.0 3.0 3.0 3.0 3.0
Intenté lo siguiente no funcionó. Primero hago un booleano en todos los números> 2.5 a “1”, luego aplico una máscara a la sum acumulada:
df = df.mask((df > 2.5).cumsum(axis=1) > 0, df)
Puede encontrar el primer valor no NaN
por where
con bfill
y seleccionar la primera columna por iloc
:
m = (df > 2.5).cumsum(axis=1) > 0 s = df.where(m).bfill(axis=1).iloc[:, 0] print (s) John 2.8 Terry 4.1 Henry 3.0 Name: 1, dtype: float64 df = df.mask(m, s, axis=0)
O shift
máscara y avance NaN
s a los últimos valores:
m = (df > 2.5).cumsum(axis=1) > 0 df = df.mask(m.shift(axis=1).fillna(False)).ffill(axis=1) print (df) 1 2 3 4 5 6 7 John 1.3 2.8 2.8 2.8 2.8 2.8 2.8 Terry 1.1 2.3 4.1 4.1 4.1 4.1 4.1 Henry 0.3 1.0 2.0 3.0 3.0 3.0 3.0