Suchen Sie mit ArcGIS for Desktop doppelte Datensätze im Feld?

9

Ich suche nach doppelten Datensätzen in DBF-Dateien basierend auf dem Attribut 'ID'. Ich habe verschiedene DBF-Dateien von 500.000 Datensätzen bis 1,5 Millionen und ich weiß, dass es eine Vielzahl von Duplikaten gibt.

Ich möchte ein Feld 'Duplizieren' hinzufügen, das Ja oder Nein sagt (oder 1 oder 0 ist in Ordnung), wenn das ID-Attribut an anderer Stelle vorhanden ist. Wenn Sie das folgende Python-Skript in Field Calculator verwenden, wird 1 für einen doppelten Eintrag und 0 für einen eindeutigen Eintrag zurückgegeben.

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

Der erste Datensatz von beispielsweise 5 doppelten IDs wird jedoch auch als 0 zurückgegeben (die folgenden 4 werden als doppelte IDs betrachtet). Ich würde alle 5 als doppelt markiert markieren müssen, da die ID an anderer Stelle vorhanden ist.

Wenn Sie den folgenden Code verwenden, erhalten Sie eine inkrementelle Zählung, wie oft diese ID vorkommt, wobei 1 die erste Gelegenheit usw. bedeutet.

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

isDuplicateIndex( !YOUR_FIELD! )

Ich möchte nur eine 1 (oder Ja), wenn die ID dieses Datensatzes an anderer Stelle vorhanden ist! (ArcGIS Version 10.1)

Ich habe andere Antworten wie das Python-Skript zum Identifizieren doppelter Datensätze gesehen (Follow-up), aber es funktioniert nicht ganz.

Sam
quelle

Antworten:

11

Eine alternative Lösung besteht darin, das vorhandene Tool " Zusammenfassungsstatistik " in ArcGIS zu verwenden und dann die resultierende Tabelle basierend auf Ihrem ID-Feld zu verknüpfen. Die Duplikate haben einen "COUNT" größer als 1, so dass es einfach ist, ihn mit Ihrem Feldrechner zu berechnen.

Radouxju
quelle
Wie erreicht Ihre Methode die Zuweisung des ersten doppelten Datensatzes als '0'?
Artwork21
@ radouxju Danke für deine Antwort, ich kann sehen, wie viele Polygone Duplikate sind, indem ich jetzt einfach nach Attributen auswähle. Überrascht fiel mir das nicht ein, als all das Python-Zeug es tat!
Sam
@ artist21 Ich wollte nicht, dass das erste Duplikat eine 0 ist, ich wollte, dass alles, was ein Duplikat hat, ein 'JA' ist, oder jetzt - so wie es ist - eine Zahl größer als 1
Sam
@Sam, worauf beziehen Sie sich mit dieser Aussage? "Der erste Datensatz von beispielsweise 5 doppelten IDs wird jedoch auch als 0 zurückgegeben."
Artwork21
@ artist21. Entschuldigung, ich denke, mein ursprünglicher Wortlaut war nicht sehr klar, ich werde ihn ändern. Was ich damit sagen wollte, war, dass wenn 5 Datensätze alle dieselbe ID hätten, dieser Python-Code die erste Instanz als eindeutige ID und die nachfolgenden 4 als Duplikate identifizieren würde. Ich wollte, dass alle 5 als Duplikate markiert werden (dh diese ID existiert an anderer Stelle)
Sam
1

Eine andere alternative Lösung ( funktioniert nur in SDE-Umgebungen ) besteht darin, die vorhandenen SQL-Funktionen in ArcGIS zu verwenden, um die doppelten Datensätze anzuzeigen

Doppelte Datensätze in Tabelle abrufen (nach Attribut auswählen)

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

Beispiel:

ID In (SELECT ID FROM GISDATA.MY_TABLE GROUP BY ID HAVING Count(*)>1 )
Tristan vorwärts
quelle
Können Sie dies in einer Datei-Geodatabase zum Laufen bringen? Die Abfrage funktioniert erfolgreich in einer persönlichen Geodatabase. Wenn ich jedoch versuche, sie in einer Datei-Geodatabase auszuführen, schlägt die Meldung "Eine ungültige SQL-Anweisung wurde verwendet" fehl. Edit: nach der Dokumentation Link nur begrenzte Unterabfragen werden in File - Geodatabases unterstützt.
Isburns
Die Abfrage wird direkt aus Ihrem Beitrag kopiert und verweist auf die richtigen Tabellen- und Feldnamen. Die Abfrage ist gültig, wenn ich entferne HAVING COUNT(*) > 1. Ich sehe wirklich keine Möglichkeit, es in Datei- Geodatabases zum Laufen zu bringen. Ich weiß, dass dieser technische Artikel etwas veraltet ist, aber er scheint die Quelle Ihrer SQL-Anweisung zu sein und zeigt an, dass er in Datei-Geodatabases nicht funktioniert. Ich bin bereit, Ihre Antwort zu bewerten, wenn ich sie in Datei-GDBS zum Laufen bringen kann, oder es wird eine Klarstellung hinzugefügt, um anzuzeigen, dass sie die Ausnahme sind.
Isburns
@isburns Ich habe mich geirrt, arbeitet in einer SDE-Umgebung und nicht in einer Datei-Geodatabase. Als Problemumgehung können Sie die Tabellendaten in Excel einbinden, die Duplikate suchen und dann die Liste der Dupes in ArcGIS wieder hinzufügen, die dann nur diese Datensätze anzeigen, die nicht ideal sind, aber funktionieren.
Tristan Forward
1
Danke für das Update. Ich habe Ihre Antwort positiv bewertet, weil sie funktioniert und in den unterstützten Geodatabases ziemlich einfach und schnell ist. Ich weiß, dass es jetzt in den Kommentaren steht, aber Sie können den Beitrag auch selbst bearbeiten, um anzuzeigen, dass er in persönlichen und SDE-Geodatabases funktioniert, jedoch nicht in Datei-Geodatabases oder Shapefiles.
Isburns
0

Das folgende Skript erstellt ein neues Feld mit der Anzahl der Vorkommen jedes Werts aus einem angegebenen Feld. Wenn Sie beispielsweise 6 Mal "Paris" in diesem Feld haben, erhält jede Zeile mit "Paris" eine 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.")

Es kann leicht geändert werden, so dass Sie "Ja" oder 1 haben können, wenn die Anzahl> 1 ist, aber ich denke, dass es nützlicher ist, die tatsächliche Anzahl zu haben.

Später bearbeiten: Oder Sie können dies im Feldrechner verwenden. Pre-Logic-Skriptcode:

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

doppeltes Feld =

duplicates(!sample_field!)
Panda
quelle