[英]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.