Лечить пропущенные значения (условное вменение) панд - PullRequest
1 голос
/ 04 апреля 2019

У меня есть блок в обработке отсутствующих данных

У меня есть этот df

index                   a          b     c      del 
2018-06-25 12:51:00    NaN        NaN   NaN      1
2018-06-25 12:52:00    NaN        NaN   NaN     NaN
2018-06-25 12:53:00    NaN        NaN   NaN     NaN 
2018-06-25 12:54:00    NaN        NaN   NaN     NaN 
2018-06-25 12:55:00    NaN        NaN   NaN     NaN
2018-06-25 12:56:00    NaN        NaN   NaN     NaN 
2018-06-25 12:57:00    NaN        NaN   NaN     NaN 
2018-06-25 12:58:00    0.5        0.6   0.6     0.0
2018-06-25 12:59:00    NaN        NaN   NaN     0.0
2018-06-25 13:00:00    0.6        0.8   0.6     0.0
2018-06-25 13:01:00    NaN        NaN   NaN     0.0 
2018-06-25 13:02:00    0.6        0.9   0.6     0.0

что я хочу сделать

интерполировать пропущенные значения, если значениеdel не пропущено

у меня есть это решение, сохраняйте только df, когда del имеет значение, и я делаю интерполяцию после конкатенации

, но я хочу избежать конкатенации и слишком большого количества строккод и переменные

dfs= df.loc[df['del'].notnull(),:]
dfs.interpolate(method='time')

dfs1= df.loc[df['del'].isnull(),:]

dfs= pd.concat([dfs,dfs1], axis=1, sort=True,  join_axes=[df.index])

желаемый результат:

index                   a          b     c        del 
2018-06-25 12:51:00    NaN        NaN   NaN       1.0
2018-06-25 12:52:00    NaN        NaN   NaN       NaN
2018-06-25 12:53:00    NaN        NaN   NaN       NaN 
2018-06-25 12:54:00    NaN        NaN   NaN       NaN 
2018-06-25 12:55:00    NaN        NaN   NaN       NaN
2018-06-25 12:56:00    NaN        NaN   NaN       NaN 
2018-06-25 12:57:00    NaN        NaN   NaN       NaN 
2018-06-25 12:58:00    0.5        0.6   0.6       0.0
2018-06-25 12:59:00    0.6        0.7   0.7       0.0
2018-06-25 13:00:00    0.6        0.8   0.6       0.0
2018-06-25 13:01:00    0.7        0.9   0.7       0.0 
2018-06-25 13:02:00    0.6        0.9   0.6       0.0

история с тем, как просто закрыть маленькое отверстие по столбцу

Спасибо << </p>

1 Ответ

0 голосов
/ 04 апреля 2019

Используйте .loc для назначения интерполяции только там, где 'del' не равно нулю:

df.loc[df['del'].notnull()] = df.loc[df['del'].notnull()].interpolate(method='time')

                        a     b    c  del
2018-06-25 12:51:00   NaN   NaN  NaN  1.0
2018-06-25 12:52:00   NaN   NaN  NaN  NaN
2018-06-25 12:53:00   NaN   NaN  NaN  NaN
2018-06-25 12:54:00   NaN   NaN  NaN  NaN
2018-06-25 12:55:00   NaN   NaN  NaN  NaN
2018-06-25 12:56:00   NaN   NaN  NaN  NaN
2018-06-25 12:57:00   NaN   NaN  NaN  NaN
2018-06-25 12:58:00  0.50  0.60  0.6  0.0
2018-06-25 12:59:00  0.55  0.70  0.6  0.0
2018-06-25 13:00:00  0.60  0.80  0.6  0.0
2018-06-25 13:01:00  0.60  0.85  0.6  0.0
2018-06-25 13:02:00  0.60  0.90  0.6  0.0
...