繁体   English   中英

在条件下填充df的NaN值

[英]fill NaN values of a df under condition

我有一个重新采样的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'] 最初是“布尔”类型,没有数字(1 或 0) - 我该如何更改?

df['status'] 列的 NaN 值应该简单地继续(最后一个条目是打开的,然后应该用 on 填充行直到关闭)。

现在其他列的其他行应该以不同的方式填充,具体取决于状态是打开还是关闭:

状态 == 开启:加载 = 'true'; 能量 = 最后一个现有条目; power = 最后一个现有条目; id == 最后一个现有条目

状态==关闭:加载='假'; 能量 = 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 before.= next ID),功率和能量应设置为 0。

像这样使用for循环

df["status"]=[df["status"].values[i-1] if pd.isna(x) else x for i,x in enumerate (df["status"].values) ]

首先,对于 boolean 列,您可以使用:

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"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM