Панды заполняются и переходят в среднее

#python #pandas

#python #панды

Вопрос:

Я пытаюсь заполнить все пропущенные значения до конца фрейма данных, но не могу этого сделать. В приведенном ниже примере я беру среднее значение последних трех значений. Мой код заполняется только до 2017-01-10, тогда как я хочу заполнить до 2017-01-14. Для 1/14 я хочу использовать значения из 11,12 и 13. Пожалуйста, помогите.

 import pandas as pd

df = pd.DataFrame([
    {"ds":"2017-01-01","y":3},
    {"ds":"2017-01-02","y":4},
    {"ds":"2017-01-03","y":6},
    {"ds":"2017-01-04","y":2},
    {"ds":"2017-01-05","y":7},
    {"ds":"2017-01-06","y":9},
    {"ds":"2017-01-07","y":8},
    {"ds":"2017-01-08","y":2},
    {"ds":"2017-01-09"},
    {"ds":"2017-01-10"},
    {"ds":"2017-01-11"},
    {"ds":"2017-01-12"},
    {"ds":"2017-01-13"},
    {"ds":"2017-01-14"}
    ])

df["y"].fillna(df["y"].rolling(3,min_periods=1).mean(),axis=0,inplace=True)
  

Результат:

            ds    y
0   2017-01-01  3.0
1   2017-01-02  4.0
2   2017-01-03  6.0
3   2017-01-04  2.0
4   2017-01-05  7.0
5   2017-01-06  9.0
6   2017-01-07  8.0
7   2017-01-08  2.0
8   2017-01-09  5.0
9   2017-01-10  2.0
10  2017-01-11  NaN
11  2017-01-12  NaN
12  2017-01-13  NaN
13  2017-01-14  NaN
  

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

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

Комментарии:

1. Какой ожидаемый результат? Вам нужно df["y"].rolling(3,min_periods=1).mean().ffill() ? Или df["y"].ffill().rolling(3,min_periods=1).mean() ?

2. Обновлено с желаемым результатом.

Ответ №1:

Вы можете перебирать значения в y, и если встречается значение nan, посмотрите на 3 более ранних значения и используйте .at[], чтобы установить среднее из 3 более ранних значений в качестве нового значения:

 for index, value in df['y'].items():
    if np.isnan(value):
        df['y'].at[index] = df['y'].iloc[index-3: index].mean()
    
  

Результирующий фрейм данных для отсутствующих значений:

 7   2017-01-08  2.000000
8   2017-01-09  6.333333
9   2017-01-10  5.444444
10  2017-01-11  4.592593
11  2017-01-12  5.456790
12  2017-01-13  5.164609
13  2017-01-14  5.071331