Python 使用enumerate在第n行中执行某些操作
我有两列,每N行比较一次。如果它遇到第n行,它将比较它们,并将If语句的结果放入一个新列中 当我尝试枚举函数时,它总是在if语句的true部分结束。不知何故,这段代码始终贯穿始终: 如果(计数%3)==0: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”,其
对于计数,枚举中的因子(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来说仍然是新的