#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