Как добавить строки с пропущенными значениями в одном столбце и интерполировать значения других столбцов?
Есть 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 шт):
один из простых вариантов решения:
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
по умолчанию метод interpolate() работает в направлении forward, поэтому если код немного сократить, то результат по идее будет тот же:
res = df.set_index('Minute').reindex(range(60)).interpolate().bfill()