用枚举在第n行中做某事

时间:2019-10-02 08:14:47

标签: python dataframe

我有两列,我想每隔n行进行比较。如果遇到第n行,它将对其进行比较,并将if语句的结果放在新列中。

当我尝试枚举函数时,它总是以if语句的真实部分结尾。这段代码总以某种方式始终存在:

如果(计数%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

在“信号”列中,我希望每第3行为“ 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

我在这里想念什么?

3 个答案:

答案 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

答案 1 :(得分: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

答案 2 :(得分:0)

您可以使用np.vectorize这样避免循环:

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