如何解决Python-在迭代过程中锁定值
我声明自己不是伪知识专家。通过这篇文章,我想了解如何在上述过程(例如:for循环)中使用锁定值对过程进行迭代。
我将逐步解释我在寻找什么。 一开始我会建立一个数据框。
import pandas as pd
# Build the Dataframe
data = {'Col_1' : pd.Series(list(range(10,53,3))),'Col_2' : pd.Series(list(range(30,45))),'Col_3' : pd.Series([0,1,-1,0])}
data = pd.DataFrame(data)
data['Result'] = 0
data['Result_1'] = 0
# Define a constant
c = 2
下面是上面代码的结果。
Col_1 Col_2 Col_3 Result Result_1
0 10 30 0 0 0
1 13 31 0 0 0
2 16 32 1 0 0
3 19 33 0 0 0
4 22 34 0 0 0
5 25 35 -1 0 0
6 28 36 0 0 0
7 31 37 0 0 0
8 34 38 1 0 0
9 37 39 0 0 0
10 40 40 0 0 0
11 43 41 0 0 0
12 46 42 -1 0 0
13 49 43 0 0 0
14 52 44 0 0 0
话虽如此,我想创建一个迭代过程(例如:for循环),该过程遵循以下条件:
-
如果Col_3 = 1锁定Col_1中的值,请最后使用此命令在Col_2中执行操作,直到Col_3中的值等于-1,然后将结果放入“结果”列中。
-
如果Col_3 = -1使用上一点的锁定值,则对“上一点”执行相同的操作,此外,对于定义的常量'c',还要多加获得的结果。将结果放入“结果_1”列。
-
否则,将两个列(“ Result”和“ Result_1”)中的值都设为0。
下面显示了迭代过程如何工作。
Col_1 Col_2 Col_3 Result Result_1
0 10 30 0 0 0
1 13 31 0 0 0
2 16 32 1 (16-32) 0
3 19 33 0 (16-33) 0
4 22 34 0 (16-34) 0
5 25 35 -1 0 (16-35)*c
6 28 36 0 0 0
7 31 37 0 0 0
8 34 38 1 (34-38) 0
9 37 39 0 (34-39) 0
10 40 40 0 (34-40) 0
11 43 41 0 (34-41) 0
12 46 42 -1 0 (34-42)*c
13 49 43 0 0 0
14 52 44 0 0 0
下面显示了预期的数据框。
Col_1 Col_2 Col_3 Result Result_1
0 10 30 0 0 0
1 13 31 0 0 0
2 16 32 1 -16 0
3 19 33 0 -17 0
4 22 34 0 -18 0
5 25 35 -1 0 -38
6 28 36 0 0 0
7 31 37 0 0 0
8 34 38 1 -4 0
9 37 39 0 -5 0
10 40 40 0 -6 0
11 43 41 0 -7 0
12 46 42 -1 0 -16
13 49 43 0 0 0
14 52 44 0 0 0
总而言之,我知道我可以以一种更简单的方式获得相同的结果,而无需使用迭代器,但是在这种特定情况下,我正在寻找可以向我解释的人,我将如何完成迄今为止所解释的过程。使用迭代器(迭代器可以是for循环,也可以是while或其他)。
在此先感谢您的帮助!
解决方法
一种方法可能是使用data
循环遍历for
的索引:
on = False # Switch starts with off (= False)
for i in data.index:
if on:
if data.at[i,'Col_3'] == -1: # Check if -1 in Col_3 is reached
on = False # Switch off (= False)
data.at[i,'Result_1'] = c * (col_1 - data.at[i,'Col_2'])
else:
data.at[i,'Result'] = col_1 - data.at[i,'Col_2']
else:
if data.at[i,'Col_3'] == 1: # Check if 1 in Col_3 is reached
on = True # Switch on (= True)
col_1 = data.at[i,'Col_1'] # Store value of Col_1 in this position
data.at[i,'Col_2']
变量on
跟踪程序是否处于哪个“阶段”(在Col_3中介于1到-1之间)。
具有while
的版本在索引上进行迭代:
iterator = iter(data.index)
while True:
try:
i = next(iterator)
except StopIteration:
break
if data.at[i,'Col_3'] == 1: # Check for 1 in Col_3
col_1 = data.at[i,'Col_1'] # Store value of Col_1 in this position
while data.at[i,'Col_3'] != -1:
data.at[i,'Col_2']
try:
i = next(iterator)
except StopIteration:
break
# Value -1 in Col_3 reached
data.at[i,'Col_2'])
如果没有for
,则需要使用next()
明确地进行迭代。这是在try
-except
块内完成的,以捕获StopIteration
异常,然后break
退出循环。如果您想了解发生了什么而没有抓住它,请尝试:
iterator = iter(data.index)
while True:
next(iterator)
在两个版本中,我都省略了步骤3,因为零已经在那里。
通常:for
循环是一个更加“受控”的环境。 while
循环通常提供更大的灵活性,但需要显式的迭代。
(还有其他遍历DataFrame的方法,例如data.iterrows()
或data.itertuples()
。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。