Umbral del dataframe de Pandas – Mantener el número fijo si se excede

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