Запретить pandas интерполировать от экстраполяции

#pandas #interpolation

#pandas #интерполяция

Вопрос:

Я пытаюсь интерполировать некоторые данные, содержащие NaN. Я хотел бы заполнить 1-3 последовательных NaN, но я не могу понять, как это сделать с помощью pd.interpolate()

 data_chunk = np.array([np.nan, np.nan, np.nan, 4, 5, np.nan, np.nan, np.nan, np.nan, 10, np.nan, np.nan, np.nan, 14])
data_chunk = pd.DataFrame(data_chunk)[0]
print(data_chunk)
print(data_chunk.interpolate(method='linear', limit_direction='both', limit=3, limit_area='inside'))
  

Исходные данные:

 0      NaN
1      NaN
2      NaN
3      4.0
4      5.0
5      NaN
6      NaN
7      NaN
8      NaN
9     10.0
10     NaN
11     NaN
12     NaN
13    14.0
  

Попытка интерполяции:

 0      NaN
1      NaN
2      NaN
3      4.0
4      5.0
5      6.0
6      7.0
7      8.0
8      9.0
9     10.0
10    11.0
11    12.0
12    13.0
13    14.0
  

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

 0      NaN
1      NaN
2      NaN
3      4.0
4      5.0
5      NaN
6      NaN
7      NaN
8      NaN
9     10.0
10    11.0
11    12.0
12    13.0
13    14.0
  

Любая помощь будет оценена по достоинству 🙂

Ответ №1:

Создайте логическую маску, чтобы увидеть, какие NA-groups из них имеют менее 4 последовательных NA's .

 mask = (data_chunk.notnull() != data_chunk.shift().notnull()).cumsum().reset_index().groupby(0).transform('count') < 4
  

Выберите интерполированные значения, если mask == True и в противном случае сохраните исходные значения.

 pd.concat([interpolated[mask.values[:,0] ==True], data_chunk[mask.values[:,0] == False]]).sort_index()
  

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

1. Спасибо, это было то, чего я боялся. Я надеялся, что просто не понимаю, как правильно использовать pd.interpolate. Странно, что это не является частью функции.

2. Я согласен, было бы неплохо иметь возможность указать ограничение на добавление, которое делает эту работу