Расчет расстояния из 2 файлов в Excel с использованием Python - PullRequest
0 голосов
/ 16 марта 2020

Я хочу написать программу на Python, чтобы решить эту проблему. У меня есть два файла Excel:

  1. Файл1 с идентификаторами клиентов и координатами (Long, Lat) различных контрольных точек.
  2. Файл2, содержащий все сайты и их координаты (Long, Lat).

Я хочу создать новый файл первого столбца, который показывает ближайший сайт для каждого идентификатора клиента. Идентификатор сайта клиента определяется как: Минимальное расстояние от всех сайтов во 2-м файле.

Я импортировал оба файла Excel в pythons как отдельные Dataframes File1 и File2. До сих пор я был в состоянии определить функцию для расчета расстояния. Это работает нормально.

def Distance(LatA,LongA,LatB,LongB):
    Distance = 6371 * np.arccos(np.cos(np.deg2rad(90 - LatA)) 
                        * np.cos(np.deg2rad(90 - LatB)) 
                        + np.sin(np.deg2rad(90 - LatA))
                        * np.sin(np.deg2rad(90 - LatB))
                        * np.cos(np.deg2rad(LongA - LongB))
                      )
    return Distance

Ниже код, который я написал для итеративного расчета расстояния и сохранения его в новых столбцах в File1 ('Min Distance' и 'Site ID').

File1['Min Distance']=1          # Define blank Column in File1
File1['Site_ID']=1               # Define blank Column in File1
L12={'MinDist':[1],'SiteID':[1]} # Define blank field
Dist_df=pd.DataFrame(L12)        # convert to DataFrame

for ind1,rw1 in File1.iterrows():
    for ind2,rw2 in File2.iterrows():
        DistA=0
        DistA=Distance(File1.Lat[ind1],File1.Long[ind1],File2.Lat[ind2],File2.Long[ind2])
        Dist_df.loc[ind2]=[DistA,File2.loc[ind2,'SiteID']]
    File1.loc[ind1,'Min_Distance':'Site_ID']= Dist_df[Dist_df['MinDist']==Dist_df['MinDist'].min()]

Я продолжаю получать следующие ошибки:

  • ValueError: индекс должен быть монотонным c увеличиваться или уменьшаться

  • KeyError: 'Min_Distance'

Любые предложения по исправлению ошибок и улучшению кода.

1 Ответ

0 голосов
/ 16 марта 2020

Я не могу комментировать, но попробуйте это и дайте мне знать, какие у вас проблемы:

File1['Min_Distance']=1          # Define blank Column in File1
File1['Site_ID']=1               # Define blank Column in File1
L12={'MinDist':[1],'SiteID':[1]} # Define blank field
Dist_df=pd.DataFrame(L12)        # convert to DataFrame

for ind1,rw1 in File1.iterrows():
    for ind2,rw2 in File2.iterrows():
        DistA=0
        DistA=Distance(File1.Lat[ind1],File1.Long[ind1],File2.Lat[ind2],File2.Long[ind2])
        Dist_df.loc[ind2]=[DistA,File2.loc[ind2,'SiteID']]
    File1.loc[ind1,['Min_Distance','Site_ID']]= Dist_df[Dist_df['MinDist']==Dist_df['MinDist'].min()].iloc[0,:].values

Редактировать: исправлены некоторые опечатки в вашем (Min Distance и Min_Distance, добавлены скобки к вашему lo c)

Редактировать: необходимо установить File1.loc [ind, [...]] = Dist_df [...] .values ​​

Редактировать: добавлено ilo c в '.min ()]. ​​iloc [0,:]. values', чтобы вы могли обрабатывать два сайта на одинаковом расстоянии от пользователя (просто возьмите первый)

...