【问题标题】:Distance calculation from 2 files in Excel using Python使用Python从Excel中的2个文件计算距离
【发布时间】:2020-03-16 05:32:54
【问题描述】:

我想用 Python 写一个程序来解决这个问题。我有两个 excel 文件:

  1. File1 包含各种测试的客户 ID 和坐标(经度、纬度) 分。
  2. File2 包含所有站点及其坐标(经度、纬度)。

我想创建一个新的列优先文件,该文件显示每个客户 ID 的最近站点。客户站点 ID 定义为:与第二个文件中所有站点的最小距离。

我已将 python 中的两个 excel 文件作为单独的 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 的新列中(“最小距离”和“站点 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:索引必须单调递增或递减

  • KeyError:'Min_Distance'

纠正错误和改进代码的任何建议。

【问题讨论】:

  • 请提供完整的错误信息,以及minimal reproducible example。变量名和函数名应该遵循lower_case_with_underscores 风格,事实上你没有遵循风格约定会让事情变得更难阅读。

标签: python distance


【解决方案1】:

我不会做 cmets,但试试这个,让我知道你有什么问题:

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,在您的 loc 中添加了括号)

编辑:必须设置 File1.loc[ind,[...]] = Dist_df[...].values

编辑:在 '.min()].iloc[0,:].values' 中添加了 iloc,这样您就可以处理与用户的距离完全相同的两个站点(只取第一个)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 2014-03-13
    • 1970-01-01
    相关资源
    最近更新 更多