У меня есть набор данных, который содержит каждую минуту данных за один месяц. Но есть много значений, которые отсутствуют. Мой набор данных выглядит так:
Date Col1 Col2
2018-06-01 08:01:00 Nan Nan
2018-06-01 08:02:00 14 24
2018-06-01 08:03:00 17 18
2018-06-01 08:04:00 Nan Nan
...........
...........
...........
...........
2018-06-30 23:57:00 12 13
2018-06-30 23:58:00 Nan Nan
2018-06-30 23:59:00 18 22
Во всем наборе данных будет 30 значений для каждой минуты. Итак, я хочу заполнить пропущенные значения средним значением этой минуты. И я хочу делать это каждую минуту.
Например:
Date Col1 Col2
2018-06-01 08:01:00 Nan Nan
2018-06-02 08:01:00 14 21
2018-06-03 08:01:00 16 28
2018-06-04 08:01:00 Nan Nan
...........
...........
...........
...........
2018-06-28 08:01:00 12 19
2018-06-29 08:01:00 Nan Nan
2018-06-30 08:01:00 17 22
Итак, чтобы сначала получить все значения в 08:01:00
, я сделал df.at_time('08:01:00')
который дал приведенную выше таблицу примеров. Но тогда как заполнить недостающие значения того времени? Если я делаю df.fillna(df.at_time('08:01:00').mean())
то все недостающее значение всего набора данных заполняется средним значением в 08:01:00
, но я хочу только пропущенные значения в 08:01:00
заполняется с 08:01:00
значений 08:01:00
. И я хочу этого каждую минуту.
Любая помощь будет оценена!
РЕДАКТИРОВАТЬ:
Вы можете создать фрейм данных с помощью кода ниже или вы можете создать свой собственный случайный пример
df = pd.DataFrame({'Col1': [1,5,6,Nan,Nan,Nan]}, index= ['2018-06-01 08:00:00','2018-06-01 08:01:00','2018-06-02 08:01:00','2018-06-03 08:01:00', '2018-06-04 08:01:00','2018-06-02 08:00:00'])
Я думаю, что вам нужно GroupBy.transform
временами со time
и заменить отсутствующие значения на fillna
:
print (df)
Date Col1 Col2
0 2018-06-01 08:01:00 NaN NaN
1 2018-06-02 08:01:00 14.0 24.0 <-change datetime
2 2018-06-03 08:01:00 17.0 18.0 <-change datetime
3 2018-06-01 08:04:00 NaN NaN
4 2018-06-30 23:57:00 12.0 13.0
5 2018-06-30 23:58:00 NaN NaN
6 2018-06-30 23:59:00 18.0 22.0
cols = ['Col1','Col2']
df[cols] = df[cols].fillna(df.groupby(df['Date'].dt.time)[cols].transform('mean'))
Или используйте пользовательскую лямбда-функцию:
cols = ['Col1','Col2']
df[cols] = df.groupby(df['Date'].dt.time)[cols].transform(lambda x: x.fillna(x.mean()))
print (df)
Date Col1 Col2
0 2018-06-01 08:01:00 15.5 21.0
1 2018-06-02 08:01:00 14.0 24.0
2 2018-06-03 08:01:00 17.0 18.0
3 2018-06-01 08:04:00 NaN NaN
4 2018-06-30 23:57:00 12.0 13.0
5 2018-06-30 23:58:00 NaN NaN
6 2018-06-30 23:59:00 18.0 22.0
Вы ищете это?
df.fillna(df.mean())
Для определенного столбца вы можете:
df['column'] = df['column'].fillna((df['column'].mean()))
df = pd.DataFrame({'Col1': [1,5,6,Nan,Nan,Nan]}, index= ['2018-06-01 08:00:00','2018-06-01 08:01:00','2018-06-02 08:01:00','2018-06-03 08:01:00', '2018-06-04 08:01:00','2018-06-02 08:00:00'])