С данными, как показано ниже
data = """
Class,Location,Long,Lat
A,ABC11,139.6295542,35.61144069
A,ABC20,139.630596,35.61045559
A,ABC03,139.6300307,35.61327781
B,ABC54,139.7787818,35.68847945
B,ABC05,139.7814447,35.6816882
B,ABC06,139.7788191,35.681865
B,ABC24,139.7790396,35.67781697
"""
df = pd.read_csv(StringIO(data))
Каждая строка содержит данные, относящиеся к местоположению. Для каждого местоположения нужно найти расстояние до других местоположений (рядов) следующим образом (упрощено для простоты)
distance = sqrt((Long1-Long2)^2 + (Lat1-Lat2)^2)
, если бы это было сделано за пределами панд, я бы сделал следующее
import math
rows = df.to_dict('records')
# distance of each location w.r.t other locations excluding self
results = {}
for row in rows:
loc = row['Location']
results[loc] = {}
# get a new list excl the curr row
nrows = [row for row in rows if row['Location'] != loc]
for nrow in nrows:
dist = math.sqrt((row["Long"] - nrow["Long"])**2 + (row["Lat"] - nrow["Lat"])**2)
results[loc][nrow["Location"]] = dist
# find the location with min distance
fin_results = {}
for k, v in results.items():
fin_results[k] = {}
minValKey = min(v, key = v.get)
fin_results[k]["location"] = minValKey
fin_results[k]["dist"] = v[minValKey]
Это даст вывод, подобный приведенному ниже, который для каждого местоположения дает местоположение, которое является самым ближайшим и расстояние до этого местоположения.
{'ABC11': {'location': 'ABC20', 'dist': 0.001433795400325211}, 'ABC20': {'location': 'ABC11', 'dist': 0.001433795400325211}, 'ABC03': {'location': 'ABC11', 'dist': 0.001897909941062068}, 'ABC54': {'location': 'ABC06', 'dist': 0.006614555169662396}, 'ABC05': {'location': 'ABC06', 'dist': 0.002631545857463665}, 'ABC06': {'location': 'ABC05', 'dist': 0.002631545857463665}, 'ABC24': {'location': 'ABC06', 'dist': 0.004054030973106164}}
Хотя это работает функционально, хотел знать, что будет pandas
способ сделать это.
Желаемый вывод
+----------+-------------------+----------------------------+
| location | nearest_location | nearest_location_distance |
+----------+-------------------+----------------------------+
| 'ABC11' | 'ABC20' | 0.001433795400325211 |
| 'ABC20' | 'ABC11' | 0.001433795400325211 |
| 'ABC03' | 'ABC11' | 0.001897909941062068 |
| 'ABC54' | 'ABC06' | 0.006614555169662396 |
| 'ABC05' | 'ABC06' | 0.002631545857463665 |
| 'ABC06' | 'ABC05' | 0.002631545857463665 |
| 'ABC24' | 'ABC06' | 0.004054030973106164 |
+----------+-------------------+----------------------------+