我有一个名为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
答案 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
使用测地距离:
答案 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以便仅对点子集执行此操作。