python pandas

python - Incremento de agregar bajo condición en pandas



(5)

Ayuna con Numba

from numba import njit @njit def f(u): out = np.zeros(len(u), np.int64) a = out[0] = u[0] for i in range(1, len(u)): if u[i] == 1: if u[i - 1] == 0: a += 1 out[i] = a return out f(df.servo_in_position.to_numpy()) array([0, 0, 1, 0, 2, 2, 0, 0, 3, 0, 4, 0, 5, 5, 5, 0, 0, 0, 6, 6, 0, 0, 0])

Para el siguiente marco de datos de pandas

servo_in_position second_servo_in_position Expected output 0 0 1 0 1 0 1 0 2 1 2 1 3 0 3 0 4 1 4 2 5 1 4 2 6 0 5 0 7 0 5 0 8 1 6 3 9 0 7 0 10 1 8 4 11 0 9 0 12 1 10 5 13 1 10 5 14 1 10 5 15 0 11 0 16 0 11 0 17 0 11 0 18 1 12 6 19 1 12 6 20 0 13 0 21 0 13 0 22 0 13 0

Quiero aumentar la columna "Salida esperada" solo si "servo_in_position" cambia de 0 a 1. También quiero asumir que "Salida esperada" es 0 (nulo) si "servo_in_position" es igual a 0.

Lo intenté

input_data[''second_servo_in_position'']=(input_data.servo_in_position.diff()!=0).cumsum()

pero da salida como en la columna "second_servo_in_position", que no es lo que quería.

Después de eso me gustaría agrupar y calcular la media usando:

print("Mean=/n/n",input_data.groupby(''second_servo_in_position'').mean())


Eso es cumsum y mul

df.servo_in_position.diff().eq(1).cumsum().mul(df.servo_in_position.eq(1),axis=0)


Prueba np.where :

df[''Expected_output''] = np.where(df.servo_in_position.eq(1), df.servo_in_position.diff().eq(1).cumsum(), 0)


Usa cumsum y mask :

df[''E_output''] = df[''servo_in_position''].diff().eq(1).cumsum()/ .mask(df[''servo_in_position''] == 0, 0)

Salida:

servo_in_position second_servo_in_position Expected output E_output 0 0 1 0 0 1 0 1 0 0 2 1 2 1 1 3 0 3 0 0 4 1 4 2 2 5 1 4 2 2 6 0 5 0 0 7 0 5 0 0 8 1 6 3 3 9 0 7 0 0 10 1 8 4 4 11 0 9 0 0 12 1 10 5 5 13 1 10 5 5 14 1 10 5 5 15 0 11 0 0 16 0 11 0 0 17 0 11 0 0 18 1 12 6 6 19 1 12 6 6 20 0 13 0 0 21 0 13 0 0 22 0 13 0 0


Usando cumsum y aritmética.

u = df[''servo_in_position''] (u.eq(1) & u.shift().ne(1)).cumsum() * u

0 0 1 0 2 1 3 0 4 2 5 2 6 0 7 0 8 3 9 0 10 4 11 0 12 5 13 5 14 5 15 0 16 0 17 0 18 6 19 6 20 0 21 0 22 0 Name: servo_in_position, dtype: int64