Viac

Použite Python na nájdenie duplicitných hodnôt v triede prvkov a vyplnenie poľa

Použite Python na nájdenie duplicitných hodnôt v triede prvkov a vyplnenie poľa


Takže som našiel tento pythonový skript v inom príspevku tu a pokúšal som sa ho prispôsobiť svojim potrebám. Som veľmi nováčik v pythone, takže bojujem s tým, ako upraviť skript. Mám triedu funkcií uloženú v množine údajov funkcií, ktorú chcem v poli vyhľadať pre duplicitné hodnoty a do nového poľa vyplniť Y pre duplikát alebo N pre žiadne. Nižšie uvedený skript je to, čo som zistil, že vyzerá, že to bude fungovať, akonáhle nájdem spôsob, ako sa ponoriť do svojej geodatabázy súborov.

from arcpy import * inShapefile = pointsShapefile checkField = "xyCombine" updateField = "dplicate" #Zoznam hodnôt nájdených raz sa vyskytneOnce = [] #zistenie hodnôt nájdených dvakrát sa vyskytneTwice = [] kurzor = da.SearchCursor (inShapefile, [checkField]) pre riadok v kurzore: #Kontrola hodnoty nie je null, ak riadok [0]: #Ak sa už nezistil výskyt dvakrát, pokračujte, ak sa nevyskytne riadok [0] Dvakrát: #Ak sa nevyskytol ešte raz, ak nie, occursOnce: #Add to occurs once list occursOnce.append (row [0]) #If value has already been found once else: #Add to occurs dvakrát list (duplicates) occursTwice.append (row [0]) del cursor cursor = da .UpdateCursor (inShapefile, [checkField, updateField]) pre riadok v kurzore: #Check hodnota nie je null, ak riadok [0]: #check if value in occursTwice list (ie is duplicate) if row [0] in occursTwice: row [ 1] = "Y" else: riadok [1] = "N" cursor.updateRow (riadok) del kurzor

Niečo také by malo fungovať:

importujte arcpy inShapefile = pointsShapefile checkField = "xyCombine" updateField = "dplicate" s arcpy.da.SearchCursor (inShapefile, [checkField]) ako riadky: hodnoty = [r [0] pre r v riadkoch] d = {} pre položku v set (values): if values.count (item)> 1: d [item] = 'Y' else: d [item] = 'N' with arcpy.da.UpdateCursor (inShapefile, [checkField, updateField]) as rows : pre riadok v riadkoch: ak riadok [0] v d: riadok [1] = d [riadok [0]] riadkov.updateRow (riadok)

A ako navrhuje @mr.adam, slovník nie je potrebný. tu je čistejšia verzia:

import arcpy def findDupes (inShapefile, checkField, updateField): s arcpy.da.SearchCursor (inShapefile, [checkField]) ako riadky: hodnoty = [r [0] pre r v riadkoch] s arcpy.da.UpdateCursor (inShapefile, [ checkField, updateField]) ako riadky: pre riadok v riadkoch: if values.count (riadok [0])> 1: riadok [1] = 'Y' else: riadok [1] = 'N' riadkov.updateRow (riadok) if __name__ == '__main__': fc = r'C:  TEMP  crm_test.gdb  test 'fld =' Project_Manager 'up =' duplicates 'findDupes (fc, fld, up)

Ak máte licenciu Advanced alebo Info, ďalšou možnosťou v Arcu je použiť nástroj Nájsť identické. Získate tak tabuľku ID riadkov so zhodnými hodnotami. Použite možnosť ONLY_DUPLICATES. Potom spojte tabuľku s triedou funkcií (fc ObjectID až InFID tabuľky) pomocou kľúčového slova KEEP_COMMON pre typ spojenia (toto je podobné definičnému dotazu, pretože vaša trieda funkcií zobrazí iba zodpovedajúce záznamy) ... Potom vykonajte pole výpočet na vrstve. Nakoniec odstráňte spojenie, aby boli k dispozícii ostatné funkcie.

Neviem, ako sa to dá porovnať s účinnosťou kurzora da. Len ďalšia možnosť.


Poskytujem novšie riešenie na hľadanie duplikátov a pridanie počtu do nového poľa. Je to priamo z dokumentu pomocníka ESRI: Ako identifikovať duplicitné alebo jedinečné hodnoty v ArcGIS Pro.

import arcpy "Tento skript spočíta počet výskytov hodnoty v poli (" field_in ") a zapíše ich do nového poľa (" field_out ")" arcpy.env.workspace = r "C:  Users  DuplicateTesting. gdb "#path to GDB goes here infeature =" backup_02232021 "#name of feature class goes here field_in =" location_string_output "#column you looking for the duplicates in field_out =" COUNT _ "+field_in arcpy.AddField_management (infeature, field_out, "SHORT") lista = [] cursor1 = arcpy.SearchCursor (infeature) for row in cursor1: i = row.getValue (field_in) lista.append (i) del cursor1, row cursor2 = arcpy.UpdateCursor (infeature) for row in cursor2: i = row.getValue (field_in) occ = lista.count (i) row.setValue (field_out, occ) cursor2.updateRow (riadok) del cursor2, row print ("---- done ----")