【发布时间】:2018-01-16 16:07:19
【问题描述】:
希望得到一些帮助。我有一个数据框,它以 State & Level 列开始,仅当 Signal 列 = True 时才具有值,否则值为 None 和 0.0。 Signal = True 时的 State 初始值只能是 Neutral 或 Low,这由 Low 列的值决定(0 = Neutral,1= Low)。
温度信号状态低中高电平
217.46 错误 无 1 1 0
217.09 错误 无 0 1 0
216.55 错误 无 0 0 0
216.66 真 低 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 真 中性 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 1 0
215.27 错误 无 1 0 0
我想要做的是遍历行以根据 State 的先前值和 Low、Mid、High 值更新 State 列。
如果初始状态值 = 中性,那么它只能在当前行的低列值 = 1 其中状态 = '低' 或 Temp
如果初始状态值 = "Low",则只有在当前行 Low 列值 = 0 且 Mid 列 = 1 时才能更改为 "Mid",否则如果 Low 列的当前值 = 1,则该值将继续为“低”。如果 Low 和 Mid 列值都 = 0,则 State 的值 = 'X'。
同样的逻辑适用于从“中”到“高”状态列值的移动。 "Mid" 只有在 Mid 列的当前值 = 0 和 High 列 = 1 时才能更改为 'High'。如果两者都是 = 0 则 State 的值 = 'X'
X 充当循环结束标志。在另一个 Signal = True 出现之前,无需进一步分析。
以下是预期输出的示例。如您所见,您不能仅向前返回状态(即从中到低或从高到中),并且仅当当前状态列(低,中,高)值从 1 移动到 0 并且下一个值等于 t0 时1. 你不能在一次迭代中跳转多个状态(即从低到高)。
温度信号状态 Low Mid High Level
217.46 错误 无 1 1 0
217.09 错误 无 0 1 0
216.55 错误 无 0 0 0
216.66 真 低 1 0 1 216.49
216.86 FALSE 低 1 0 0
216.94 FALSE 低 1 0 0
216.73 假中 0 1 0
216.9 假高 1 0 1
216.5 FALSE 高 0 0 1
216.89 假高 1 1 1
216.29 FALSE 高 0 1 1
215.69 错误 X 0 1 0
214.97 错误 无 0 0 0
215.3 真 中性 0 0 1 214.97
215.06 FALSE 中性 0 0 0
215.21 FALSE 低 1 0 0
214.86 FALSE 低 1 0 0
214.88 假中 0 1 0
214.85 假中 0 1 0
215.27 假 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
【问题讨论】: