Encontrando registros duplicados em campo usando o ArcGIS for Desktop?


9

Estou procurando registros duplicados em arquivos dbf com base no atributo chamado 'ID'. Eu tenho vários arquivos dbf de 500.000 registros a 1,5 milhão e sei que há uma série de duplicatas.

Eu gostaria de adicionar um campo 'Duplicar' que diga Sim ou Não (ou 1 ou 0 está correto) quando o atributo ID estiver presente em outro lugar. O uso do seguinte script python na Calculadora de campo retorna 1 para uma entrada duplicada e 0 para uma entrada exclusiva;

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

No entanto, o 1º registro, por exemplo, de 5 IDs duplicados também será retornado como 0 (os 4 subsequentes são considerados duplicados). Eu precisaria que todos os 5 fossem marcados como duplicados, pois o ID existe em outro lugar.

O uso do código a seguir fornecerá uma contagem incremental de quantas vezes esse ID ocorre com 1, significando a 1ª ocasião e assim por diante;

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

isDuplicateIndex( !YOUR_FIELD! )

Eu só quero um 1 (ou Sim) se o ID desse registro existir em outro lugar! (ArcGIS versão 10.1)

Eu já vi outras respostas, como o script Python, para identificar registros duplicados (acompanhamento), mas não funciona muito bem.

Respostas:


11

Uma solução alternativa é usar a ferramenta " estatísticas de resumo " existente no ArcGIS, e você ingressará na tabela resultante com base no seu campo de ID. As duplicatas terão um "COUNT" maior que 1, portanto, é simples calculá-lo com sua calculadora de campo.


Como seu método consegue atribuir o primeiro registro duplicado encontrado como '0'?
precisa saber é o seguinte

@ radouxju Obrigado pela sua resposta, posso ver quais quantidades de polígonos são duplicadas simplesmente selecionando por atributo agora. Surpreendeu que isso não me ocorreu quando todas as coisas de python aconteceram!
Sam

@ artwork21 eu não quero o 1º duplicado para ser um 0, eu queria qualquer coisa que teve uma duplicata a ser um 'SIM' ou agora - como é - um número maior do que 1
Sam

@ Sam, sobre o que você está se referindo com esta declaração "no entanto, o primeiro registro de, por exemplo, 5 IDs duplicados também será retornado como 0;"?
precisa saber é o seguinte

@ artwork21. Desculpas, acho que minha redação original não foi muito clara, vou alterar. O que eu estava tentando dizer era que, se 5 registros tivessem o mesmo ID, esse código python identificaria a 1ª instância como um ID exclusivo e os 4 subsequentes como duplicados. Eu queria que todos os 5 fossem marcados como duplicados (ou seja, que o ID existia em outro lugar) #
Sam

1

Outra solução alternativa ( funciona apenas com ambientes SDE ) é usar a funcionalidade SQL existente no ArcGIS para mostrar os registros duplicados

Obter registros duplicados na tabela (selecione por atributo)

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

Exemplo:

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

Você pode fazer isso funcionar em um geodatabase de arquivo? A consulta funciona com êxito em um geodatabase pessoal, mas quando tento executá-lo em um geodatabase de arquivo, ela falha com a mensagem "Uma instrução SQL inválida foi usada". Editar: de acordo com o link da documentação , apenas subconsultas limitadas são suportadas nos bancos de dados geográficos de arquivos.
isburns

A consulta é copiada diretamente da sua postagem e faz referência aos nomes corretos de tabela e campo. A consulta é válida quando eu removo HAVING COUNT(*) > 1. Realmente não vejo uma maneira de fazê-lo funcionar em bancos de dados geográficos de arquivos . Sei que este artigo técnico é um pouco datado, mas parece ser a fonte da sua instrução SQL e indica que não funciona nos bancos de dados geográficos de arquivos. Estou pronto para votar sua resposta, se eu puder fazê-lo funcionar no arquivo gdbs, ou esclarecimentos são adicionados para indicar que são a exceção.
isburns

@isburns Eu estava enganado, trabalha no ambiente SDE e não arquiva geodatabase. Uma coisa que você pode fazer como solução alternativa é trazer os dados da tabela para o Excel, encontrar as duplicatas e depois ingressar na lista de duplicatas no ArcGIS, que mostraria apenas esses registros, não o ideal, mas funciona.
Tristan Forward

11
Obrigado pela atualização. Votei sua resposta porque ela funciona e é bastante simples e rápida nos bancos de dados geográficos suportados. Sei que está nos comentários agora, mas você também pode editar a postagem para indicar que ela funciona em bancos de dados pessoais e geodados SDE, mas não em arquivos geodatabases ou shapefiles.
isburns

0

O script a seguir cria um novo campo com o número de ocorrências de cada valor de um campo especificado. Portanto, por exemplo, se você tiver "Paris" 6 vezes nesse campo, cada linha com "Paris" receberá 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.")

Ele pode ser facilmente modificado para que você possa ter "Sim" ou 1 se contar> 1, mas acho que ter o número de contagem real é mais útil.

Editar mais tarde: Ou você pode usar isso na calculadora de campo. Código do script pré-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!)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.