在条件下填充df的NaN值

时间:2020-08-08 09:51:04

标签: python pandas

我有一个重新采样的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。

2 个答案:

答案 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"