9 votos

¿Encontrar registros duplicados en el campo utilizando ArcGIS for Desktop?

Estoy buscando registros duplicados en archivos dbf basados en el atributo llamado 'ID'. Tengo varios archivos dbf desde 500.000 registros hasta 1,5 millones y sé que hay un montón de duplicados.

Me gustaría añadir un campo 'Duplicado' que diga Sí o No (o 1 o 0 está bien) cuando el atributo ID está presente en otro lugar. Usando el siguiente python script 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 identificaciones duplicadas también se devolverá como un 0 (los 4 siguientes se consideran los duplicados). Necesitaría que los 5 fueran marcados como duplicados ya que el ID existe en otro lugar.

El uso del siguiente código le dará un recuento incremental de cuántas veces ocurre ese ID, siendo 1 la primera ocasión y así sucesivamente;

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

isDuplicateIndex( !YOUR_FIELD! )

Sólo quiero un 1 (o Sí) si el ID de ese registro existe en otro lugar. (ArcGIS versión 10.1)

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

11voto

xenny Puntos 670

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

0 votos

¿Cómo consigue su método asignar el primer registro duplicado encontrado como "0"?

0 votos

@ radouxju Gracias por tu respuesta, ahora puedo ver qué cantidad de polígonos están duplicados simplemente seleccionando por atributo. ¡Me sorprendió que no se me ocurriera esto cuando todo lo de python lo hizo!

0 votos

@artwork21 no quería que el 1er duplicado fuera un 0, quería que todo lo que tuviera un duplicado fuera un 'SI', o ahora - como es - un número mayor que 1

1voto

Dave Moore Puntos 1633

Otra solución alternativa ( sólo funciona con entornos SDE ) es utilizar 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 )

0 votos

¿Se puede conseguir 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 ha utilizado una sentencia SQL no válida". Edición: según la documentación enlace En el caso de las bases de datos de archivos, sólo se admiten subconsultas limitadas.

0 votos

La consulta está copiada directamente de tu post y hace referencia a los nombres correctos de tablas y campos. La consulta es válida cuando elimino HAVING COUNT(*) > 1 . Realmente no veo la manera de que funcione en archivo bases de datos geográficos. Sé que esto artículo técnico es algo anticuado, pero parece ser la fuente de tu sentencia SQL e indica que no funciona en las geodatabases de archivos. Estoy dispuesto a upvote su respuesta si puedo hacer que funcione en gdbs archivo, o se añade una aclaración para indicar que son la excepción.

0 votos

@isburns Me he equivocado, funciona en el entorno SDE y no en la geodatabase de archivos. Una cosa que usted puede hacer como una solución es llevar los datos de la tabla en Excel encontrar los duplicados y luego unirse a la lista de duplicados de nuevo en ArcGIS que entonces sólo mostrar esos registros, no es ideal, pero funciona.

1voto

halcyonforever Puntos 11

El siguiente script crea un nuevo campo con el número de apariciones de cada valor de un campo especificado. Así, 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 count>1, pero supongo que tener el número real de count es más útil.

Edición posterior: O puedes usar esto en la calculadora de campo. Código 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!)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X