Home Articles

熊猫 - 经过2列(纬度和经度),找到每个坐标和特定地点之间的距离

Asked
Viewed 1232 times
2

我有一个包含3列的数据框(称为坐标):索引,纬度,经度 - 它有大约1,000行 . 我有一个特定地点的坐标,想要找到地点和数据框中所有坐标之间的距离 . 目前,我可以使用geopy.distance来查找两个特定坐标之间的距离 . 例如 .

import geopy.distance
site_coords = (38.898556, -77.037852)
place2_coords = (38.897147, -77.043934)
print(geopy.distance.vincenty(site_coords, place2_coords).km)

上面的代码给出了0.5503161689006362(我已经检查过,这是正确的)

我的问题是循环数据框(称为坐标)并计算该数据框中所有坐标的距离 . 目前,这就是我所拥有的:

import geopy.distance
import pandas as pd
df = pd.read_csv('coordinates.csv', sep=',', header=None)

site_coords = (38.898556, -77.037852)
for index, row in df.iterrows():
    place2_coords = df
    x = geopy.distance.vincenty(site_coords, place2_coords).km
    print(x)

但是,当我打印x时,它会多次打印相同的距离,并且距离不正确 . 坐标文件看起来像(在记事本中打开时) - 但还有更多行:

,Latitude,Longitude
0,73.3645,-0.9015
1,73.3645,-0.3995
2,73.3645,-0.5825

所以我需要一种循环并找到距离的方法 .

3 Answers

  • 1

    几件事,首先你要求元组和数据帧之间的距离,我不知道它是如何工作的 . 但是,假设数据框 df 只有两列,以下循环应该适合您

    site_coords = (38.898556, -77.037852)
    for index, row in df.iterrows():
        if index > 0:
            x = geopy.distance.vincenty(site_coords, (row[1],row[2])).km
            print(x)
    
  • 1

    如果您的文件看起来像

    ,Latitude,Longitude
    0,73.3645,-0.9015
    1,73.3645,-0.3995
    2,73.3645,-0.5825
    

    但你读的是“head = None”,

    df = pd.read_csv('coordinates.csv', sep=',', header=None)
    

    第一行将成为数据行 . 这可能是您获得“AttributeError:'Series'对象没有属性'Latitude'的原因 . ”

    尝试从代码中删除“header = None” .

    df = pd.read_csv(StringIO(s), sep=',')
    site_coords = (38.898556, -77.037852)
    
    df.apply(lambda row: geopy.distance.vincenty(site_coords, (row.Latitude, row.Longitude)).km, axis=1)
    
  • 1

    iterrows 方法将为数据框的每一行提供 pandas.Series 对象,因此您可以稍微创建 place2_coords .

    import geopy.distance
    import pandas as pd
    df = pd.read_csv('coordinates.csv', sep=',')
    
    site_coords = (38.898556, -77.037852)
    for index, row in df.iterrows():
        place2_coords = (row.Latitude, row.Longitude)
        x = geopy.distance.vincenty(site_coords, place2_coords )).km
        print(x)
    

    使用pandas时,不推荐使用循环行 . 相反,您可以沿列应用函数 .

    def calc_distance(x):
        site_coords = (38.898556, -77.037852)
        place2_coords = (x.Latitude, x.Longitude)
        return geopy.distance.vincenty(site_coords, place2_coords )).km
    df.apply(calc_distance, axis = 1)
    

Related