Trouver des enregistrements en double dans un champ à l'aide d'ArcGIS for Desktop?

9

Je recherche des enregistrements en double dans des fichiers dbf basés sur l'attribut appelé «ID». J'ai divers fichiers dbf de 500 000 enregistrements à 1,5 million et je sais qu'il existe une multitude de doublons.

Je voudrais ajouter un champ «Dupliquer» qui dit Oui ou Non (ou 1 ou 0 est bien) lorsque l'attribut ID est présent ailleurs. L'utilisation du script python suivant dans Field Calculator renvoie 1 pour une entrée en double et 0 pour une entrée unique;

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

Cependant, le 1er enregistrement de, par exemple, 5 ID en double sera également renvoyé sous la forme d'un 0 (les 4 suivants sont considérés comme des doublons). J'aurais besoin que tous les 5 soient marqués comme doublons car l'ID existe ailleurs.

L'utilisation du code suivant vous donnera un compte incrémentiel du nombre de fois que cet ID se produit, 1 signifiant la 1ère occasion, etc.

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

isDuplicateIndex( !YOUR_FIELD! )

Je veux juste un 1 (ou Oui) si l'ID de cet enregistrement existe ailleurs! (ArcGIS version 10.1)

J'ai vu d'autres réponses telles que le script Python pour identifier les enregistrements en double (suivi) mais cela ne fonctionne pas tout à fait.

Sam
la source

Réponses:

11

Une autre solution consiste à utiliser l' outil de " statistiques récapitulatives " existant dans ArcGIS, puis vous joignez la table résultante en fonction de votre champ ID. Les doublons auront un "COUNT" supérieur à 1, il est donc simple de le calculer avec votre calculatrice de champ.

radouxju
la source
Comment votre méthode parvient-elle à attribuer le premier enregistrement en double trouvé comme «0»?
artwork21
@ radouxju Merci pour votre réponse, je peux voir quelles quantités de polygones sont des doublons en sélectionnant simplement par attribut maintenant. Surpris, cela ne m'est pas venu à l'esprit quand tous les trucs en python l'ont fait!
Sam
@ artwork21 je ne voulais pas que le premier doublon soit un 0, je voulais que tout ce qui avait un doublon soit un 'OUI', ou maintenant - tel quel - un nombre supérieur à 1
Sam
@Sam, de quoi parlez-vous avec cette déclaration, "cependant le premier enregistrement de, par exemple, 5 ID en double sera également renvoyé en tant que 0;"?
artwork21
@ artwork21. Toutes mes excuses, je pense que ma formulation originale n'était pas très claire, je vais la modifier. Ce que j'essayais de dire, c'est que si 5 enregistrements avaient tous le même ID, ce morceau de code python identifierait la 1ère instance comme ID unique et les 4 suivants comme étant les doublons. Je voulais que tous les 5 soient marqués comme doublons (c'est-à-dire que l'ID existait ailleurs)
Sam
1

Une autre solution alternative ( ne fonctionne qu'avec les environnements SDE ) consiste à utiliser la fonctionnalité SQL existante dans ArcGIS pour afficher les enregistrements en double

Obtenir des enregistrements en double dans le tableau (sélectionner par attribut)

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

Exemple:

ID In (SELECT ID FROM GISDATA.MY_TABLE GROUP BY ID HAVING Count(*)>1 )
Tristan Forward
la source
Pouvez-vous faire en sorte que cela fonctionne dans une géodatabase fichier? La requête fonctionne correctement dans une géodatabase personnelle, mais lorsque j'essaie de l'exécuter dans une géodatabase fichier, elle échoue avec le message «Une instruction SQL non valide a été utilisée». Modifier: selon le lien de documentation , seules les sous-requêtes limitées sont prises en charge dans les géodatabases fichier.
isburns
La requête est copiée directement depuis votre publication et fait référence aux noms de table et de champ corrects. La requête est valide lorsque je supprime HAVING COUNT(*) > 1. Je ne vois vraiment pas de moyen de le faire fonctionner dans les géodatabases fichier . Je sais que cet article technique est quelque peu daté, mais il semble être la source de votre instruction SQL et il indique qu'il ne fonctionne pas dans les géodatabases fichier. Je suis prêt à voter pour votre réponse si je peux le faire fonctionner dans le fichier gdbs, ou si une clarification est ajoutée pour indiquer qu'ils sont l'exception.
isburns
@isburns Je me suis trompé, travaille dans un environnement SDE et non dans une géodatabase fichier. Une chose que vous pouvez faire comme solution de contournement est d'amener les données de la table dans Excel pour trouver les doublons, puis rejoindre la liste des dupes dans ArcGIS qui n'afficherait alors que ces enregistrements, pas idéal mais fonctionne.
Tristan Forward
1
Merci pour la mise à jour. J'ai surévalué votre réponse car elle fonctionne et est assez simple et rapide dans les géodatabases prises en charge. Je sais que c'est dans les commentaires maintenant, mais vous voudrez peut-être également modifier le message lui-même pour indiquer qu'il fonctionne dans les géodatabases personnelles et SDE, mais pas dans les géodatabases fichier ou les fichiers de formes.
isburns
0

Le script suivant crée un nouveau champ avec le nombre d'occurrences de chaque valeur d'un champ spécifié. Donc, par exemple, si vous avez "Paris" 6 fois dans ce domaine, chaque ligne avec "Paris" obtiendra 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.")

Il peut être facilement modifié pour que vous puissiez avoir "Oui" ou 1 si compter> 1, mais je suppose que le fait d'avoir le numéro de compte réel est plus utile.

Édition ultérieure: Ou vous pouvez l'utiliser dans la calculatrice de terrain. Code de script pré-logique:

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

champ en double =

duplicates(!sample_field!)
Panda
la source