比较两个数据集中的两组属性并使用匹配项更新第三个数据集

2024-06-26 13:23:57 发布

您现在位置:Python中文网/ 问答频道 /正文

关于我的代码,我有几个问题。一个是为什么我在使用uber嵌套for循环时遇到麻烦,另一个是如果有人对改进我的代码有任何建议

我试图编写代码,通过比较小空间数据集(inputDs)中的列和一个名为refDs的大型引用数据集,对其进行规范化,然后在一个名为“matches”的新表中返回可能的匹配项。正在比较的字段包括:

参考纬度, 参考经度, inputDs lat(我将其复制到一个列表,inLat), inDs long(在另一个列表中,inLong)

refDs字段“NameCertified”(位置的正式名称), refDs字段“nameTransliterated”(为了该代码,这是该位置的一个或多个备用名称), inDs nameAtt(复制到列表中,inAtt), inDs nameTrans(复制到列表,内部网)

所以对于那些正在计算的人来说,这是四个列表——每个inputDs属性一个列表,表中的四列refDs将进行比较。首先,如果坐标对齐(彼此之间的距离在5以内),则REFD和inputDs记录将添加到新表“matches”。然后,必须对每个名称属性进行两次比较——refAtt到inAtt、refTrans到inAtt、refAtt到inTrans和refTrans到inTrans,对于每个名称匹配,matches中的count属性(“mCount”)都将获得+=1。此外,REFD和IND中的某些nameTrans字段的名称为0或多于1

下面的代码显示了我是如何为我的matches表使用嵌套的insert游标的,它遍历我的inLat和inLong列表,将它们以及refLat和refLong传递给great circle distance函数(我成功地添加了该函数)。看一看:

   # set variables
   lat1 = "reprLat"
   lon1 = "reprLong"
   lat2 = inLat
   lon2 = inLong
   refAtt = refDs.nameAttested
   refTrans = refDs.nameTransliterated

   # insertCursor for matches Table
    rows = arcpy.da.InsertCursor(matches, [lat1, lon1, lat2, lon2, refAtt, refTrans,"inAtt", 
    "inTrans", "mCount"])

    #searchcursor for refDs
    refCursor = arcpy.da.SearchCursor(refDs, ["reprLat", "reprLong"])


   for i in lat2:
       for x in lon2:
            for y in lat1:
                for z in lon1:
                    if great_circle(lon1[0], lat1[0], lon2[0], lat2[0]) <= 5:
                        rows.insertRow()
                        for x in inAtt:
                            for y in inTrans:
                                for z in refAtt:
                                    for i in refTrans:
                                        if textdistance.jaro(refAtt, inAtt) >= 0.45:
                                            mCount += 1
                                        elif textdistance.jaro(refAtt, inTrans) >= 0.45:
                                            mCount += 1
                                        elif textdistance.jaro(refTrans, inAtt) >= 0.45:
                                             mCount += 1
                                        elif textdistance.jaro(refTrans, inTrans) >= 0.45:
                                             mCount += 1

我测试了第一部分(测量距离),在Juptyer中使用一个简单的if<;=5、打印“是”,否则打印“否”。不管我测量的距离是多少(5,20,100,1000),我要么都是肯定的,要么都是否定的,所以我显然做错了什么。有人能告诉我如何修复该部分的语义吗

还有,有没有其他方法来制作这些嵌套。。。更优雅?今年我才开始学习编码,我仍然在学习很多基本的东西,犯一些基本的错误

先谢谢你


Tags: 代码in名称列表formatcheslat1lon1