我想要做的是迭代行以根据State的先前值以及Low,Mid,High值更新State列。
如果初始状态值=中性,那么它只能在当前行的低列值= 1时改变,其中State ='Low'或者如果Temp< State ='X'的级别。
如果初始状态值=“低”,则只有当前行低列值= 0且中间列= 1时才能更改为“中”,否则如果低列当前值= 1则该值将继续要'低'。如果Low和Mid列值均为0,则State ='X'的值。
同样的逻辑适用于从'Mid'移动到'High'State列Value。只有当Mid列的当前值= 0且High列= 1时,“Mid”才能更改为“High”。如果两者都为= 0则则State ='X'的值
X充当循环标志的结束。在另一个Signal = True出现之前,不需要进一步分析。
以下是预期输出的示例。正如您所看到的那样,只有当前状态列(低,中,高)值从1移动到0并且下一个值等于t0时,才能返回状态(即从中间到低或高到中) 1.并且你不能在一次迭代中跳过多个状态(即从低到高)。
温度信号状态低中高水平
217.46否否1 0 0
217.09否否0 1 0
216.55否否0 0 0
216.66 TRUE低1 0 1 216.49
216.86 FALSE低1 0 0
216.94 FALSE低1 0 0
216.73 FALSE中0 0 1
216.9否则高1 0 1
216.5 FALSE高0 0 1
216.89否定高1 1 1
216.29否则高0 1 1
215.69 FALSE X 0 1 0
214.97否否0 0 0
215.3 TRUE Neutral 0 0 1 214.97
215.06 FALSE Neutral 0 0 0
215.21 FALSE低1 0 0
214.86 FALSE低1 0 0
214.88 FALSE中午0 1 0
214.85 FALSE Mid 0 1 0
215.27 FALSE X 1 0 0
所以我的问题是如何最好地处理这个问题,我有大约100,000行数据可以通过。索引从0开始编号。我可以使用.iterrows假设,甚至不确定它是否会起作用,因为我需要访问State的先前值来确定当前的State值。我是熊猫的新手,不知道这是不是最好的方法。速度对我来说是一个值得关注的问题。
我开始有类似这样的东西,但它会成为一些超级意大利面条代码,混合了一些肉丸! :)
for i, row in df.iterrows():
if (i>1) and (df.loc[i-1,'State'] == 'Neutral') and (df.loc[i,'Level'] < df.loc[i,'Temp']):
if (df.loc[i,'Low']== 0):
new_State = 'Neutral'
else:
new_State = 'Low'
df.loc[i,'State'] = new_State
答案 0 :(得分:0)
您可以这样更新pandas数据帧。
a = 0
for index, row in df.iterrows():
df.iloc[a, df.columns.get_loc('B_lat')] = "Values"
a = a + 1
df.loc [] 更新特定值。例如,&#34; a &#34;定义行的编号和&#34; df.columns.get_loc(&#39; B_lat&#39;)&#34;定义列。在特定单元格更新右侧值。