Pandas - 通过插值法填充缺失的经纬度坐标
Pandas - fill missing lat long cordinates by interpolation
数据框如下
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
需要为 Lat
和 Long
字段填写 NaN
值,这样每一行 Lat / Long 的 NaN 值都采用这样的值:
- 它们落在下一个(比如 x2,y2)和
之间的一条直线上
- 前面的非 NaN lat/long(比如 x1,y1)点并且在它们之间等距。
在上面的例子中,由于 Lat/Long 有 NaN 的三行,他们需要在非 NaN 行之间取 3 个等距的点
有没有办法用 pandas 实现这个,还是应该在外面完成?
更新:
按照评论中的建议尝试了 df.interpolate() - 有效!!
你可以试试这个(这是 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
现在我们可以计算我们想要的任何指标:
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
希望对您有所帮助:)
按照评论中的建议尝试了 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
数据框如下
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
需要为 Lat
和 Long
字段填写 NaN
值,这样每一行 Lat / Long 的 NaN 值都采用这样的值:
- 它们落在下一个(比如 x2,y2)和 之间的一条直线上
- 前面的非 NaN lat/long(比如 x1,y1)点并且在它们之间等距。
在上面的例子中,由于 Lat/Long 有 NaN 的三行,他们需要在非 NaN 行之间取 3 个等距的点
有没有办法用 pandas 实现这个,还是应该在外面完成?
更新:
按照评论中的建议尝试了 df.interpolate() - 有效!!
你可以试试这个(这是 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
现在我们可以计算我们想要的任何指标:
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
希望对您有所帮助:)
按照评论中的建议尝试了 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