Как добавить строки с пропущенными значениями в одном столбце и интерполировать значения других столбцов?

Есть DataFrame. Данные для него тут

Фрагмент:

 Minute lat         lon
0   14  60.062369   30.414337
1   15  59.990670   30.371345
2   16  59.996071   30.379581
5   19  59.996483   30.374481
6   20  59.996792   30.372728
7   21  59.997036   30.371002
8   22  59.997318   30.369425
9   23  59.997433   30.367680
10  24  59.997738   30.366079
12  26  59.999001   30.365751
13  27  59.999538   30.366537

  

В чем суть. Тут собраны координаты траектории. Столбец ['Minute'] - это временная точка. В приведенном выше фрейме она начинается с [14] и заканчивается [27].

Мне надо, чтобы фрейм начинался с [0] и заканчивался [59]. Все недостающие значения ['Minute'] надо заполнить, также значения координат [lot] и [lat], надо интерполировать, чтобы не были пустые.

Например, для значений [0...13] - можно заполнить первым известным значением [14] (lat-60.062369, lon-30.414337). Значения [17,18] - интерполировать значениями точек [16,19] (например, померив расстояние между точками [16] и [19], затем разделить на 3 и последовательно прибавлять к [17], а затем и к [18] точке). Недостающие значения с [28...59] заполнить значением последней известной точка [27].

У меня получается очень громоздкий код. Хотел попросить помощи в этом деле.


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

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

один из простых вариантов решения:

min_min, max_min = df["Minute"].min(),  df["Minute"].max()
res = df.set_index("Minute").reindex(np.arange(60))
res.loc[:min_min], res.loc[max_min:] = \
    res.loc[:min_min].bfill(), res.loc[max_min:].ffill()
res = res.interpolate().reset_index()

результат:

In [349]: res.loc[16:19]
Out[349]:
    Minute        lat        lon
16      16  59.996071  30.379581
17      17  59.996208  30.377881
18      18  59.996346  30.376181
19      19  59.996483  30.374481
→ Ссылка
Автор решения: SergFSM

по умолчанию метод interpolate() работает в направлении forward, поэтому если код немного сократить, то результат по идее будет тот же:

res = df.set_index('Minute').reindex(range(60)).interpolate().bfill()
→ Ссылка