Pandas - заполнить пропущенные латинские кординаты путем интерполяции - PullRequest
3 голосов
/ 27 января 2020

С кадром данных, как показано ниже

Time    Lat    Long
19:24:52.135    35.61067    139.630228
19:24:52.183    NaN NaN
19:24:52.281    NaN NaN
19:24:52.378    NaN NaN
19:24:52.466    35.610692   139.630428

Необходимо заполнить значения NaN для полей Lat и Long, чтобы каждая строка со значениями NaN для широты / долготы принимала значение, такое что:

  1. они попадают на прямую линию между следующими (скажем, x2, y2) и
  2. предыдущими точками не NaN lat / long (скажем, x1, y1) и расположены на равном расстоянии между их.

В вышеприведенном случае, поскольку есть три строки с NaN для широты / долготы, они должны занимать 3 одинаково разнесенные точки между не-NaN строками

Есть ли способ достижения этого с помощью pandas или это должно быть сделано за пределами?

Обновление:

Попытка df.interpolate () как предложено в комментариях - это работает !!

Ответы [ 2 ]

0 голосов
/ 28 января 2020

Пробовал df.interpolate () , как предлагается в комментариях - это работает !!

(Pdb) df["Long"].interpolate(method='linear')
0    139.630228
1    139.630278
2    139.630328
3    139.630378
4    139.630428
Name: Long, dtype: float64
(Pdb) df["Long"].interpolate()
0    139.630228
1    139.630278
2    139.630328
3    139.630378
4    139.630428
Name: Long, dtype: float64
0 голосов
/ 28 января 2020

Вы можете попробовать это (это решение для Lat и то же самое можно сделать для Long):

df = pd.DataFrame({'Lat':[35.61069, np.nan, np.nan, np.nan, 35.610692], 'Long': [139.630428, np.nan, np.nan, np.nan, 139.630428]})

df
         Lat        Long
0  35.610690  139.630428
1        NaN         NaN
2        NaN         NaN
3        NaN         NaN
4  35.610692  139.630428

Давайте создадим новый столбец с последним значением, отличным от Nan Lat

df['Lat_shift'] = df['Lat'].shift()
df['Lat_shift'] = df['Lat_shift'].fillna(method='ffill')

df
         Lat        Long  Lat_shift
0  35.610690  139.630428        NaN
1        NaN         NaN   35.61069
2        NaN         NaN   35.61069
3        NaN         NaN   35.61069
4  35.610692  139.630428   35.61069

Теперь мы можем вычислить любую метрику c, которую мы хотим:

df['Lat_new'] = df['Lat_shift'] + (df['Lat'] - df['Lat_shift'])/2

         Lat        Long  Lat_shift    Lat_new
0  35.610690  139.630428        NaN        NaN
1        NaN         NaN   35.61069        NaN
2        NaN         NaN   35.61069        NaN
3        NaN         NaN   35.61069        NaN
4  35.610692  139.630428   35.61069  35.610691

и использовать ее для заполнения значений nan:

df.loc[pd.isnull(df['Lat']), 'Lat'] = df['Lat_new'].fillna(method='bfill')

df.drop(columns=['Lat_shift', 'Lat_new'])

         Lat        Long
0  35.610690  139.630428
1  35.610691         NaN
2  35.610691         NaN
3  35.610691         NaN
4  35.610692  139.630428

Надеюсь, это поможет: )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...