Python 使用enumerate在第n行中执行某些操作

Python 使用enumerate在第n行中执行某些操作,python,dataframe,Python,Dataframe,我有两列,每N行比较一次。如果它遇到第n行,它将比较它们,并将If语句的结果放入一个新列中 当我尝试枚举函数时,它总是在if语句的true部分结束。不知何故,这段代码始终贯穿始终: 如果(计数%3)==0: 对于计数,枚举中的因子(df.index): 如果(计数%3)=0:#每第三行 df['Signal']=np.其中(df['Wind Ch']>=df['Rain Ch'],'1','-1') 其他: df['Signal']=0 在“信号”列中,我希望每第三行有一个“1”或“-1”,其

我有两列,每N行比较一次。如果它遇到第n行,它将比较它们,并将If语句的结果放入一个新列中

当我尝试枚举函数时,它总是在if语句的true部分结束。不知何故,这段代码始终贯穿始终:

如果(计数%3)==0:

对于计数,枚举中的因子(df.index):
如果(计数%3)=0:#每第三行
df['Signal']=np.其中(df['Wind Ch']>=df['Rain Ch'],'1','-1')
其他:
df['Signal']=0
在“信号”列中,我希望每第三行有一个“1”或“-1”,其他所有行都有一个“0”。然而,我在每一行上得到'1'或'-1'

现在我得到:

            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
但我想得到:

              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

我在这里遗漏了什么?

通常,您不希望在对象上循环。这种情况也不例外

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

通常,您不希望在对象上循环。这种情况也不例外

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

在我看来,没有必要使用枚举函数。而且您的逻辑也有错误。您在循环的每次迭代中重写完整的列,而不是列的第i行。你可以这么做

 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

在我看来,没有必要使用枚举函数。而且您的逻辑也有错误。您在循环的每次迭代中重写完整的列,而不是列的第i行。你可以这么做

 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

您可以这样做,使用以避免循环:

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

您可以这样做,使用以避免循环:

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

不够清楚,请考虑改革。为我们显示每三行所需的输入/输出,您可以。。。覆盖整个
df['Signal']
列的内容,实际上不使用
count
factors
或任何其他有关行的信息。(对于其他行,用零填充整个
df['Signal']
)我重新编辑了我的原始帖子,这样事情会更清楚。也许我用的枚举函数在我想实现的错误,还是新的Python不够清楚,请考虑改造。为我们显示每三行所需的输入/输出,您可以。。。覆盖整个
df['Signal']
列的内容,实际上不使用
count
factors
或任何其他有关行的信息。(对于其他行,用零填充整个
df['Signal']
)我重新编辑了我的原始帖子,这样事情会更清楚。也许在我想要实现的目标中,我使用的枚举函数是错误的,对python来说仍然是新的