Find closest point in Pandas DataFrames

前端 未结 1 1267
孤独总比滥情好
孤独总比滥情好 2021-01-13 03:55

I am quite new to Python. I have the following table in Postgres. These are Polygon values with four coordinates with same Id with ZONE name I have

相关标签:
1条回答
  • 2021-01-13 04:38

    This sounds like a good use case for scipy cdist, also discussed here.

    import pandas as pd
    from scipy.spatial.distance import cdist
    
    
    data1 = {'Lat': pd.Series([50.6373473,50.63740441,50.63744285,50.63737839,50.6376054,50.6375896,50.6374239,50.6374404]),
             'Lon': pd.Series([3.075029928,3.075068636,3.074951754,3.074913884,3.0750528,3.0751209,3.0750246,3.0749554]),
             'Zone': pd.Series(['A','A','A','A','B','B','B','B'])}
    
    data2 = {'Lat': pd.Series([50.6375524099,50.6375714407]),
             'Lon': pd.Series([3.07507914474,3.07508201591])}
    
    
    def closest_point(point, points):
        """ Find closest point from a list of points. """
        return points[cdist([point], points).argmin()]
    
    def match_value(df, col1, x, col2):
        """ Match value x from col1 row to value in col2. """
        return df[df[col1] == x][col2].values[0]
    
    
    df1 = pd.DataFrame(data1)
    df2 = pd.DataFrame(data2)
    
    df1['point'] = [(x, y) for x,y in zip(df1['Lat'], df1['Lon'])]
    df2['point'] = [(x, y) for x,y in zip(df2['Lat'], df2['Lon'])]
    
    df2['closest'] = [closest_point(x, list(df1['point'])) for x in df2['point']]
    df2['zone'] = [match_value(df1, 'point', x, 'Zone') for x in df2['closest']]
    
    print(df2)
    #    Lat        Lon       point                           closest                  zone
    # 0  50.637552  3.075079  (50.6375524099, 3.07507914474)  (50.6375896, 3.0751209)  B
    # 1  50.637571  3.075082  (50.6375714407, 3.07508201591)  (50.6375896, 3.0751209)  B
    
    0 讨论(0)
提交回复
热议问题