Решение без петель:
import pandas as pd
from itertools import combinations
import geopy.distance as gd
def geo_dist(lat_x, long_x, lat_y, long_y):
return round(gd.great_circle((lat_x, long_x), (lat_y, long_y)).miles,1)
# Input DataFrame
data = {'site1': ['san jose','chicago','boston','san francisco'],
'state': ['CA','IL','MA','CA'],
'lat': [32.3843,25.6449,53.344,32.4932],
'long': [-99.25942,-98.2424,-92.3434,-97.345],
'misc1': [0,0,0,0],
'misc2': [1,1,1,1]}
df = pd.DataFrame(data)
# Neigbors DataFrame
dfn = pd.DataFrame({'site1':['san jose'], 'site2':['san francisco']})
dfn['neighbor'] = 'Y'
# Get Combinations
df1 = pd.DataFrame(list(combinations(df['site1'],2)), columns=['site1','site2'])
# Merge site1
df1 = pd.merge(df1, df[['site1','lat', 'long']], how='left', on='site1')
# Merge site2
df = df.rename(columns={'site1': 'site2'})
df1 = pd.merge(df1, df[['site2','lat', 'long']], how='left', on='site2')
# Calculate distance
df1['distance'] = df1.apply(lambda r : geo_dist(r['lat_x'], r['long_x'], r['lat_y'], r['long_y'] ), axis = 1)
# Drop unused columns
df1 = df1.drop(columns=['lat_x', 'long_x', 'lat_y', 'long_y'])
# Merge with neighbor DataFrame
df1 = pd.merge(df1, dfn, how='left', on=['site1','site2']).fillna('N')
print(df1)
Вывод:
site1 site2 distance neighbor
0 san jose chicago 469.7 N
1 san jose boston 1488.2 N
2 san jose san francisco 111.9 Y
3 chicago boston 1938.0 N
4 chicago san francisco 476.3 N
5 boston san francisco 1461.8 N