【问题标题】:fill NaN values of a df under condition在条件下填充df的NaN值
【发布时间】:2020-08-08 09:51:04
【问题描述】:

我有一个重新采样的 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 值应该简单地继续(最后一个条目是打开的,然后应该用打开填充这些行直到关闭)。

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

status == on: loading = 'true';能量 = 最后一个现有条目; power = 最后一个现有条目; id == 最后一个现有条目

status == off: 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),功率和能量应设置为 0。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

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

    df["Loading"] = df["Loading"].map({1:True, np.nan: False})
    

    用于填写 NA:

    df["status"] = df["status"].ffill()
    

    最后对于条件,我没完全理解你的描述,是不是有些情况是“没有身份证”?也许这可以工作:

    df.at[df[status]=="off","ID"] = "no ID"
    

    【讨论】:

    • 填充 nan 值的条件比预期的要复杂:我有不同的循环,用不同的 ID 标记。在一个周期内(ID 出现在 nan 值之前和之后),两条“周围”线的功率应该被平均,并且在列能量中应该输入列能量的最后一个现有值。在循环之外(ID 之前!= 下一个 ID),功率和能量应设置为 0。
    【解决方案2】:

    像这样使用for循环

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

    【讨论】:

    • 此代码不起作用。此处返回“无效语法”错误。能否请您调整代码,我不知道如何
    猜你喜欢
    • 2022-07-20
    • 2020-12-25
    • 1970-01-01
    • 2021-01-09
    • 2020-12-06
    • 2021-12-25
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    相关资源
    最近更新 更多