Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pandas-通过插值填充缺失的lat long Cordinate_Python_Pandas_Interpolation_Latitude Longitude - Fatal编程技术网

Python Pandas-通过插值填充缺失的lat long Cordinate

Python Pandas-通过插值填充缺失的lat long Cordinate,python,pandas,interpolation,latitude-longitude,Python,Pandas,Interpolation,Latitude Longitude,使用数据帧,如下所示 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)和下一个之间

使用数据帧,如下所示

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)点,并在它们之间等距分布
  • 在上述情况下,由于有三行具有NaN表示Lat/Long,因此它们需要在非NaN行之间取3个等距点

    有没有办法用熊猫来实现这一点,还是应该在户外实现

    更新:

    按照评论中的建议进行尝试-效果很好

    您可以尝试以下方法(这是Lat的解决方案,也可以长期使用):

    让我们用最后一个not 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
    
    我希望它能有所帮助:)

    按照评论中的建议进行尝试-效果不错

    (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
    

    在这种情况下,一个简单的函数可以工作吗..?或者
    df.ffill()
    ?阅读更多我相信@Chris idea应该会起作用,但请记住,您可能需要处理180和90坐标附近的缠绕:)
    (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