Как заполнить series ближайшим неотрицательным значением в Pandas

Есть pandas series примерно такой:

|column|
|----|
|-999|
|-999|
|0.1|
|0.15|
|-999|
|0.3|
|0.7|
|-999|

То есть в нем упорядоченные значения по возрастанию и есть пропущенные значения в виде -999, которые нужно заменить на ближайшее неотрицательное значение, при чем пока без разницы будет это большее или меньшее. В моем примере на выходе должно быть примерно как в колонке new_column:

|column|new_column|
|----|------|
|-999|0.1|
|-999|0.1|
|0.1|0.1|
|0.15|0.15|
|-999|0.3|
|0.3|0.3|
|0.7|0.7|
|-999|0.7|

Логически понимаю, что надо как то через рекурсию или через while пробегаться по массиву всех чисел, пока не найдем отличное от -999, но как быть в ситуациях где в одном случае большее число нужно брать, а в другом меньшее. В общем по кускам вроде понимаю, а как объединить в рабочее решение не пойму


Ответы (1 шт):

Автор решения: CrazyElf

В Pandas есть все нужные функции для этого. Обычно не бывает таких случаев, когда нужно что-то делать в цикле, всё можно сделать в "векторной форме" (сразу со всем вектором данных):

import pandas as pd

s = pd.Series(map(float, "-999|-999|0.1|0.15|-999|0.3|0.7|-999".split('|')))
print(s)
s[s == -999] = pd.NA
s = s.bfill().ffill()
print(s)

Вывод:

0   -999.00
1   -999.00
2      0.10
3      0.15
4   -999.00
5      0.30
6      0.70
7   -999.00
dtype: float64

0    0.10
1    0.10
2    0.10
3    0.15
4    0.30
5    0.30
6    0.70
7    0.70
dtype: float64
→ Ссылка