迭代和更新pandas dataframe

时间:2018-01-13 07:32:38

标签: pandas iteration

希望得到一些帮助。我有一个数据框,从State&仅当Signal列= True时,Level列具有值,否则值为None和0.0。当Signal = True时,State的初始值只能是Neutral或Low,它由Low列的值决定(0 = Neutral,1 = Low)。 温度信号状态低中高水平 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否否1 0 0
216.94否否1 0 0
216.73否定无0 1 0
216.9否否1 0 1
216.5否否0 0 1
216.89否定1 1 1 216.29否否0 1 1 215.69否否0 1 0 214.97否否0 0 0
215.3 TRUE Neutral 0 0 1 214.97 215.06否所有0 0 0

215.21否否1 0 0
214.86否否1 0 0

214.88否定0 1 0
214.85否定0 0 0
215.27 FALSE无1 0 0

我想要做的是迭代行以根据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

1 个答案:

答案 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;定义列。在特定单元格更新右侧值。