Как заполнить значения Nan средним для этого конкретного значения времени?

1

У меня есть набор данных, который содержит каждую минуту данных за один месяц. Но есть много значений, которые отсутствуют. Мой набор данных выглядит так:

    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'])

  • 0
    Можете ли вы дать код для воспроизведения вашего фрейма данных?
  • 0
    У меня есть это в файле Excel. Я сделал мой dataframe через это. возможно, вы можете использовать это или создать любой случайный пример: 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'])
Показать ещё 1 комментарий
Теги:
pandas

2 ответа

1
Лучший ответ

Я думаю, что вам нужно 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
  • 1
    Именно так! Благодаря тонну.
0

Вы ищете это?

df.fillna(df.mean())

Для определенного столбца вы можете:

df['column'] = df['column'].fillna((df['column'].mean()))
  • 3
    Это неверно ОП хочет, чтобы среднее значение каждой минуты вменялось за соответствующую минуту. Не имею в виду весь столбец.
  • 0
    да, как сказал @MohitMotwani, я этого не хочу.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню