我有一个重新采样的df:
Timestamp Loading Power Energy ID status
2020-04-09 06:45:00 1.0 1000 5000 1 on
2020-04-09 06:46:00 1.0 1000 5500 1 on
2020-04-09 06:47:00 NaN NaN NaN NaN NaN
2020-04-09 06:48:00 NaN NaN NaN NaN NaN
2020-04-09 06:49:00 1.0 5 0 1 off
2020-04-09 06:50:00 1.0 3000 200 2 on
...
第一件事:df ['Loading']最初是'boolean'类型,没有数字(1或0)-我该如何更改?
只需简单地继续df ['status']列的NaN值(最后一个条目为开,然后应将行填充为开,直到出现关)。
现在,应根据状态是打开还是关闭来不同地填充其他列的其他行:
状态==开启:loading ='true';能量=最后存在的条目;功率=最后存在的条目; id ==最后一个现有条目
状态==关闭:loading ='false';能量= 0;功率= 0; ID =“无ID”。
我尝试过类似的事情:
cond = (df2['Status'] != df2['Status'].shift(-1)) | (df2['Status'].notna())
df2.loc[cond] = df2.loc[cond].ffill()
没有期望的成功...
预期结果:
Timestamp Loading Power Energy ID status
2020-04-09 06:45:00 True 1000 5000 1 on
2020-04-09 06:46:00 True 1000 5500 1 on
2020-04-09 06:47:00 True 1000 5500 1 on
2020-04-09 06:48:00 True 1000 5500 1 on
2020-04-09 06:49:00 False 5 0 no Id off
2020-04-09 06:49:00 True 3000 200 2 on
...
编辑 填充nan值的条件比预期的要复杂:我有不同的周期,这些周期用不同的ID标记。在一个周期内(ID出现在nan值之前和之后),应平均两条“环绕”线的功率,并在列能量中输入列能量的最后一个现有值。在周期之外(ID之前的ID =下一个ID),功率和能量应设置为0。
答案 0 :(得分:0)
用于这样的循环
df [“状态”] = [df [“状态”] .values [i-1]如果pd.isna(x)否则x代表i,x枚举(df [“ status”] .values)]
答案 1 :(得分:0)
首先,对于布尔值列,您可以使用:
df["Loading"] = df["Loading"].map({1:True, np.nan: False})
用于填写NA:
df["status"] = df["status"].ffill()
最后,对于这种情况,我不完全理解您的描述,是否在某些情况下应为“无ID”?也许这行得通:
df.at[df[status]=="off","ID"] = "no ID"