¿Encuentra registros duplicados en el campo con ArcGIS for Desktop?

9

Estoy buscando registros duplicados en archivos dbf basados ​​en el atributo llamado 'ID'. Tengo varios archivos dbf de 500,000 registros a 1.5 millones y sé que hay una gran cantidad de duplicados.

Me gustaría agregar un campo 'Duplicar' que dice Sí o No (o 1 o 0 está bien) cuando el atributo ID está presente en otro lugar. El uso de la siguiente secuencia de comandos de Python en Field Calculator devuelve 1 para una entrada duplicada y 0 para una entrada única;

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

Sin embargo, el primer registro de, por ejemplo, 5 ID duplicados también se devolverá como un 0 (los 4 siguientes se consideran duplicados). Necesitaría que los 5 se marquen como duplicados ya que la ID existe en otro lugar.

El uso del siguiente código le dará un recuento incremental de cuántas veces se produce esa ID con 1, es decir, la primera ocasión, etc.

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

isDuplicateIndex( !YOUR_FIELD! )

¡Solo quiero un 1 (o Sí) si la ID de ese registro existe en otro lugar! (ArcGIS versión 10.1)

He visto otras respuestas como el script Python para identificar registros duplicados (seguimiento) pero no funciona del todo.

Sam
fuente

Respuestas:

11

Una solución alternativa es utilizar la herramienta " estadísticas de resumen " existente en ArcGIS, luego se une a la tabla resultante en función de su campo ID. Los duplicados tendrán un "COUNT" mayor que 1, por lo que es fácil calcularlo con su calculadora de campo.

radouxju
fuente
¿Cómo logra su método asignar el primer registro duplicado encontrado como '0'?
artwork21
@ radouxju Gracias por su respuesta, puedo ver qué cantidades de polígonos se duplican simplemente seleccionando por atributo ahora. ¡Sorprendido de que esto no se me ocurriera cuando ocurrieron todas las cosas de Python!
Sam
@ artwork21 No quería que el primer duplicado fuera un 0, quería que todo lo que tuviera un duplicado fuera un 'SÍ', o ahora, como es, un número mayor que 1
Sam
@Sam, ¿a qué se refiere con esta declaración, "sin embargo, el primer registro de, por ejemplo, 5 ID duplicados también se devolverá como un 0;"?
artwork21
@ artwork21. Disculpas, creo que mi redacción original no era muy clara, enmendaré. Lo que estaba tratando de decir era que si 5 registros tenían todos la misma ID, ese fragmento de código de Python identificaría la primera instancia como una ID única y las 4 siguientes como duplicados. Quería que los 5 se marcaran como duplicados (es decir, que esa ID existía en otro lugar)
Sam
1

Otra solución alternativa ( solo funciona con entornos SDE ) es usar la funcionalidad SQL existente en ArcGIS para mostrar los registros duplicados

Obtener registros duplicados en la tabla (seleccionar por atributo)

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

Ejemplo:

ID In (SELECT ID FROM GISDATA.MY_TABLE GROUP BY ID HAVING Count(*)>1 )
Tristán Delantero
fuente
¿Puedes hacer que esto funcione en una geodatabase de archivos? La consulta funciona correctamente en una geodatabase personal, pero cuando intento ejecutarla en una geodatabase de archivos falla con el mensaje "Se utilizó una instrucción SQL no válida". Editar: según el enlace de documentación , solo se admiten subconsultas limitadas en las geodatabases de archivos.
isburns
La consulta se copia directamente de su publicación y hace referencia a los nombres correctos de tabla y campo. La consulta es válida cuando la elimino HAVING COUNT(*) > 1. Realmente no veo una manera de hacerlo funcionar en geodatabases de archivos . Sé que este artículo técnico está algo anticuado, pero parece ser la fuente de su declaración SQL e indica que no funciona en geodatabases de archivos. Estoy listo para votar su respuesta si puedo hacer que funcione en el archivo gdbs, o se agrega una aclaración para indicar que son la excepción.
isburns
@isburns Me equivoqué, funciona en el entorno SDE y no en la geodatabase de archivos. Una cosa que puede hacer como solución alternativa es llevar los datos de la tabla a Excel, encontrar los duplicados y luego unirse a la lista de duplicados en ArcGIS que luego solo mostraría esos registros, lo que no es ideal, pero funciona.
Tristan Forward
1
Gracias por la actualización. Elevé tu respuesta porque funciona y es bastante simple y rápida en las geodatabases compatibles. Sé que está en los comentarios ahora, pero es posible que también desee editar la publicación para indicar que funciona en geodatabases personales y SDE, pero no en geodatabases de archivos o shapefiles.
isburns
0

El siguiente script crea un nuevo campo con el número de apariciones de cada valor de un campo especificado. Entonces, por ejemplo, si tienes "París" 6 veces en ese campo, cada fila con "París" obtendrá 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.")

Se puede modificar fácilmente para que pueda tener "Sí" o 1 si cuenta> 1, pero supongo que tener el número de cuenta real es más útil.

Edición posterior: o puede usar esto en la calculadora de campo. Código de script pre-lógico:

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 duplicado =

duplicates(!sample_field!)
panda
fuente