Trovare record duplicati nel campo utilizzando ArcGIS per desktop?


9

Sto cercando record duplicati nei file dbf in base all'attributo chiamato 'ID'. Ho vari file dbf da 500.000 a 1,5 milioni e so che ci sono molti duplicati.

Vorrei aggiungere un campo 'Duplica' che dice Sì o No (o 1 o 0 va bene) quando l'attributo ID è presente altrove. L'uso del seguente script python in Field Calculator restituisce 1 per una voce duplicata e 0 per una voce univoca;

uniqueList = []
def isDuplicate(inValue):
  if inValue in uniqueList:
    return 1
  else:
    uniqueList.append(inValue)
    return 0
isDuplicate(!FIELD_NAME!)

Tuttavia, il primo record di, ad esempio, 5 ID duplicati verrà anche restituito come 0 (i 4 successivi sono considerati duplicati). Avrei bisogno che tutti e 5 fossero contrassegnati come duplicati poiché l'ID esiste altrove.

L'uso del seguente codice ti darà un conteggio incrementale di quante volte quell'ID si verifica con 1 che significa la prima occasione e così via;

UniqueDict = {}
def isDuplicateIndex(inValue):
    UniqueDict.setdefault(inValue,0)
    UniqueDict[inValue] += 1
    return UniqueDict[inValue]

isDuplicateIndex( !YOUR_FIELD! )

Voglio solo un 1 (o Sì) se l'ID di quel record esiste altrove! (ArcGIS versione 10.1)

Ho visto altre risposte come lo script Python per l'identificazione di record duplicati (follow-up) ma non funziona del tutto.

Risposte:


11

Una soluzione alternativa consiste nell'utilizzare lo strumento " riepilogo statistiche " esistente in ArcGIS, quindi si unisce alla tabella risultante in base al campo ID. I duplicati avranno un "COUNT" maggiore di 1, quindi è semplice calcolarlo con il tuo calcolatore di campo.


In che modo il metodo ottiene assegnando il primo record duplicato trovato come '0'?
artwork21

@ radouxju Grazie per la tua risposta, posso vedere quali quantità di poligoni sono duplicati semplicemente selezionando ora per attributo. Mi ha sorpreso che questo non mi sia venuto in mente quando è successo tutto ciò che è vero su Python!
Sam,

@ artwork21 non volevo che il primo duplicato fosse uno 0, volevo che qualsiasi cosa che avesse un duplicato fosse un 'SÌ', o ora - così com'è - un numero maggiore di 1
Sam

@Sam, a cosa ti riferisci con questa affermazione, "tuttavia il primo record di, ad esempio, 5 ID duplicati verrà anche restituito come 0;"?
artwork21

@ artwork21. Mi scuso, penso che la mia formulazione originale non fosse molto chiara, che modificherò. Quello che stavo cercando di dire era che se tutti e 5 i record avessero lo stesso ID, quel pezzo di codice Python avrebbe identificato la prima istanza come ID univoco e le successive 4 come duplicati. Volevo che tutti e 5 fossero contrassegnati come duplicati (cioè che l'ID esistesse altrove)
Sam

1

Un'altra soluzione alternativa ( funziona solo con ambienti SDE ) è utilizzare la funzionalità SQL esistente in ArcGIS per mostrare i record duplicati

Ottieni record duplicati nella tabella (seleziona per attributo)

[FIELD_NAME] In (SELECT [FIELD_NAME] FROM [TABLE_NAME] GROUP BY [FIELD_NAME] HAVING Count(*)>1 )

Esempio:

ID In (SELECT ID FROM GISDATA.MY_TABLE GROUP BY ID HAVING Count(*)>1 )

Riesci a farlo funzionare in un file geodatabase? La query funziona correttamente in un geodatabase personale, ma quando provo a eseguirlo in un geodatabase di file non riesce con il messaggio "È stata utilizzata un'istruzione SQL non valida". Modifica: in base al collegamento alla documentazione , solo le sottoquery limitate sono supportate nei database di file geografici.
Isburns

La query viene copiata direttamente dal tuo post e fa riferimento ai nomi corretti di tabella e campo. La query è valida quando rimuovo HAVING COUNT(*) > 1. Davvero non vedo un modo per farlo funzionare nei file di geodatabase. So che questo articolo tecnico è in qualche modo datato, ma sembra essere la fonte della tua istruzione SQL e indica che non funziona nei file di geodati di file. Sono pronto a votare la tua risposta se riesco a farlo funzionare nel file gdbs, o viene aggiunto un chiarimento per indicare che sono l'eccezione.
Isburns,

@isburns Mi sono sbagliato, funziona in ambiente SDE e non file geodatabase. Una cosa che puoi fare come soluzione alternativa è portare i dati della tabella in Excel, trovare i duplicati e quindi unire nuovamente l'elenco di duplicati in ArcGIS che mostrerebbe solo quei record, non ideali ma funziona.
Tristan Forward

1
Grazie per l'aggiornamento. Ho votato a favore della tua risposta perché funziona ed è abbastanza semplice e veloce nei geodatabase supportati. So che è nei commenti ora, ma potresti anche voler modificare il post stesso per indicare che funziona in geodatabase personali e SDE ma non in file geodatabase o shapefile.
Isburns

0

Lo script seguente crea un nuovo campo con il numero di occorrenze di ciascun valore da un campo specificato. Quindi, per esempio, se hai "Parigi" 6 volte in quel campo, ogni riga con "Parigi" riceverà un 6.

import arcpy

arcpy.env.workspace=r"D:\test.gdb"
infeature="sample_feature"
field_in="sample_field"
field_out="COUNT_"+field_in

#create the field for the count values
arcpy.AddField_management(infeature,field_out,"SHORT")

#creating the list with all the values in the field, including duplicates
lista=[]
cursor1=arcpy.SearchCursor(infeature)
for row in cursor1:
    i=row.getValue(field_in)    
    lista.append(i)
del cursor1, row

#updating the count field with the number on occurrences of field_in values
#in the previously created list
cursor2=arcpy.UpdateCursor(infeature)
for row in cursor2:
    i=row.getValue(field_in)
    occ=lista.count(i)   
    row.setValue(field_out,occ)
    cursor2.updateRow(row)
del cursor2, row
print ("Done.")

Può essere facilmente modificato in modo da poter avere "Sì" o 1 se count> 1, ma immagino che avere il numero di conteggio effettivo sia più utile.

Modifica successiva: oppure potresti usarla nel calcolatore di campo. Codice script pre-logico:

infeature="sample_feature" #change with the name of your feature
lista=[]
field="sample_field" #change with your field with duplicates
cursor1=arcpy.SearchCursor(infeature)
for row in cursor1:
    i=row.getValue(field)    
    lista.append(i)
del cursor1, row

def duplicates(field_in):        
    occ=lista.count(field_in)
    return occ

campo duplicato =

duplicates(!sample_field!)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.