Tengo dos columnas que quiero comparar cada enésima fila. Si se encuentra con la enésima fila, los comparará y colocará el resultado de la declaración if en una nueva columna.

Cuando probé la función enumerar, siempre termina en la parte verdadera de la instrucción if. De alguna manera, esta parte del código siempre es verdadera:

If (cuenta% 3) == 0:

for count, factors in enumerate(df.index):
    if (count % 3)== 0: #every 3th row
        df['Signal']=np.where(df['Wind Ch']>=df['Rain Ch'],'1', '-1')
    else:
        df['Signal']=0

En la columna 'Señal' espero un '1' o '-1' cada 3a fila y un '0' en todas las demás filas. Sin embargo, obtengo '1' o '-1' en cada fila

Ahora estoy obteniendo:

            Date  Wind CH Rain CH  Signal
    0   5/10/2005  -1.85%  -3.79%       1
    1   5/11/2005   1.51%  -1.66%       1
    2   5/12/2005   0.37%   0.88%      -1
    3   5/13/2005  -0.81%   3.83%      -1
    4   5/14/2005  -0.28%   4.05%      -1
    5   5/15/2005   3.93%   1.79%       1
    6   5/16/2005   6.23%   0.94%       1
    7   5/17/2005  -0.08%   4.43%      -1
    8   5/18/2005  -2.69%   4.02%      -1
    9   5/19/2005   6.40%   1.33%       1
    10  5/20/2005  -3.41%   2.38%      -1
    11  5/21/2005   3.27%   5.46%      -1
    12  5/22/2005  -4.40%  -4.15%      -1
    13  5/23/2005   3.27%   4.48%      -1

Pero quiero obtener:

              Date  Wind CH Rain CH  Signal
     0   5/10/2005  -1.85%  -3.79%     0.0
     1   5/11/2005   1.51%  -1.66%     0.0
     2   5/12/2005   0.37%   0.88%    -1.0
     3   5/13/2005  -0.81%   3.83%     0.0
     4   5/14/2005  -0.28%   4.05%     0.0
     5   5/15/2005   3.93%   1.79%     1.0
     6   5/16/2005   6.23%   0.94%     0.0
     7   5/17/2005  -0.08%   4.43%     0.0
     8   5/18/2005  -2.69%   4.02%    -1.0
     9   5/19/2005   6.40%   1.33%     0.0
     10  5/20/2005  -3.41%   2.38%     0.0
     11  5/21/2005   3.27%   5.46%    -1.0
     12  5/22/2005  -4.40%  -4.15%     0.0
     13  5/23/2005   3.27%   4.48%     0.0

¿Qué me estoy perdiendo aquí?

1
Phaiphai 2 oct. 2019 a las 11:14

3 respuestas

La mejor respuesta

Puede hacerlo así, utilizando np.vectorize para evitar bucles:

import numpy as np

def calcSignal(x, y, i):
    return 0 if (i + 1) % 3 != 0 else 1 if x >= y else -1

func = np.vectorize(calcSignal)

df['Signal'] = func(df['Wind CH'], df['Rain CH'], df.index)

df

         Date  Wind CH Rain CH  Signal
0   5/10/2005  -1.85%  -3.79%       0
1   5/11/2005   1.51%  -1.66%       0
2   5/12/2005   0.37%   0.88%      -1
3   5/13/2005  -0.81%   3.83%       0
4   5/14/2005  -0.28%   4.05%       0
5   5/15/2005   3.93%   1.79%       1
6   5/16/2005   6.23%   0.94%       0
7   5/17/2005  -0.08%   4.43%       0
8   5/18/2005  -2.69%   4.02%      -1
9   5/19/2005   6.40%   1.33%       0
10  5/20/2005  -3.41%   2.38%       0
11  5/21/2005   3.27%   5.46%      -1
12  5/22/2005  -4.40%  -4.15%       0
13  5/23/2005   3.27%   4.48%       0
0
zipa 3 oct. 2019 a las 07:55

No hay necesidad de usar la función enumerar tal como la veo. También su lógica es defectuosa. está reescribiendo la columna completa en cada iteración del bucle en lugar de la i-ésima fila de la columna. simplemente podrías hacer esto

 for count  in range(len(df.index)):
     if (count % 3)== 0: #every 3th row
         df['Signal'].iloc[count]=np.where(df['Wind Ch'].iloc[count]>=df['Rain Ch'].iloc[count],'1', '-1')
     else:
         df['Signal'].iloc[0]=0
0
Atlas Bravoos 3 oct. 2019 a las 07:48

En general, no desea recorrer los objetos pandas. Este caso no es una excepción.

In [12]: df = pd.DataFrame({'x': [1,2,3], 'y': [10, 20, 30]})                                                                                                                                                                                                                                          

In [13]: df                                                                                                                                                                                                                                                                                            
Out[13]: 
   x   y
0  1  10
1  2  20
2  3  30

In [14]: df.loc[df.index % 2 == 0, 'x'] = 5                                                                                                                                                                                                                                                            

In [15]: df                                                                                                                                                                                                                                                                                            
Out[15]: 
   x   y
0  5  10
1  2  20
2  5  30
0
askaroni 3 oct. 2019 a las 07:48
58197650