一定距离内的位置数

时间:2019-07-29 17:45:59

标签: python dataframe conditional-statements

我有一个名为SD_Apartments的数据帧,该数据帧具有3个变量:名称(对象),纬度(float64),经度(float64)。这是公寓名称及其坐标的列表。

我还有一个名为SD_Coffee的数据框,它具有3个变量:名称(对象),纬度(float64),经度(float64)。这是咖啡店名称及其坐标的列表。

我想向SD_apartments中添加另一个名为coffee_count的变量,该变量将使我的SD_coffee数据框中列出的咖啡店位置的数量在SD_apartments中列出的每个公寓的x(例如300)米之内。

这是我正在使用的代码的设置:

import pandas as pd
import geopy.distance
from geopy.distance import geodesic

data = [['Insomnia', 32.784782, -117.129130], ['Starbucks', 32.827521, -117.139966], ['Dunkin', 32.778519, -117.154720]]
data1 = [['DreamAPT', 32.822090, -117.184200], ['OKAPT', 32.748081, -117.130691], ['BadAPT', 32.786886, -117.097536]]
SD_Coffee = pd.DataFrame(data, columns = ['name', 'latitude', 'longitude'])
SD_Apartments = pd.DataFrame(data1, columns = ['name', 'latitude', 'longitude'])

这是我要用来实现目标的代码:

def geodesic_pd(df1, df2_row):
    return [(geodesic([tuple(x) for x in row.values], [tuple(x) for x in df2_row.values]).m for row in df1)] 

SD_Apartments['coffee_count'] = pd.Series([(sum(geodesic_pd(SD_Coffee[['latitude', 'longitude']], row) < 300) for row in SD_Apartments[['latitude', 'longitude']])])

如果运行它并打印SD_Apartments,您将看到SD_Apartments如下:

       name  ...                                       coffee_count
0  DreamAPT  ...  <generator object <genexpr> at 0x000002E178849...
1     OKAPT  ...                                                NaN
2    BadAPT  ...                                                NaN

2 个答案:

答案 0 :(得分:1)

这可能会帮助您:

import pandas as pd
df = pd.DataFrame({'geodesic': [1, 10, 8, 11, 20,2,2],'apartment': list('aaceeee')})
df.nsmallest(3, 'geodesic')

另一种方法是使用K-Nearest neighbors使用测地距离:

SKLearn-KNN

答案 1 :(得分:0)

假设您正在使用pandas数据帧,那么除非您有非常大的数组,否则应该可以使用类似的东西-

import numpy as np

def geodesic_pd(df1, df2_row):
    dist = []
    for _, row in df1.iterrows():
        dist.append(geodesic(tuple(row.values), tuple(df2_row.values)).m)
    return np.array(dist)

SD_Apartments['coffee_count'] = SD_Apartments.apply(lambda row: sum(geodesic_pd(SD_Coffee[['latitude', 'longitude']], row[['latitude', 'longitude']]) < 300), axis =1)

geodesic_pd函数将测地线计算从单个元组扩展到一个数据框,再到一个数据框,下一条语句计算300米以内的咖啡店数量并将其存储在新列中。

如果数组很大,则应组合KNN以便仅对点子集执行此操作。