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