Eu tenho um número de colunas em várias tabelas dentro de um FGDB onde preciso extrair os valores exclusivos para cada coluna.
Por exemplo: os valores podem ser [1,2,2,2,3,4] e estou tentando retornar [1,2,3,4]
Eu poderia fazer esse trabalho de várias outras maneiras no ARCGIS, mas estou tentando me estender.
Eu encontrei um pedaço de python na Web que acho que fará o trabalho, mas estou lutando para executá-lo (continuo recebendo um erro de sintaxe inválido enquanto continuo recebendo o erro de sintaxe na linha 3), sem dúvida um erro de usuário realmente simples.
Snippet de código abaixo
import arcpy
def unique_values(r'N:\GISProjects\Landuse\Plant_Biosecurity_Project\ArcGIS_Online.gdb\Holdings_Property_Merge' , 'LU_ALUMMaj'):
with arcpy.da.SearchCursor(table, [field]) as cursor:
return sorted({row[0] for row in cursor})
Esta é a mensagem de erro que recebo do texto sublime:
File "C:\Users\hawkinle\Desktop\STDTAS\Unique_Data.py", line 3
def unique_values(r'N:\GISProjects\Steve_Eastwood_Landuse\Plant_Biosecurity_Project\ArcGIS_Online.gdb\Holdings_Property_Merge' , 'LU_ALUMMaj'):
^
SyntaxError: invalid syntax
[Finished in 0.1s with exit code 1]
Atualizações da pergunta original
Atualizei meu código com a resposta fornecida abaixo, mas estou recebendo um erro secundário.
Novo trecho de código:
import arcpy
def unique_values(table , field):
with arcpy.da.SearchCursor(table, [field]) as cursor:
return sorted({row[0] for row in cursor})
myValues = unique_values(r'N:\\GISProjects\\Landuse\\Plant_Biosecurity_Project\\ArcGIS_Online.gdb\\Holdings_Property_Merge' , 'LU_ALUMMaj')
print (myValues)
Estou recebendo uma nova mensagem de erro relacionada a um erro de tempo de execução
Traceback (most recent call last):
File "C:\Users\hawkinle\Desktop\STDTAS\Unique_Data.py", line 7, in <module>
myValues = unique_values(r'N:\\GISProjects\\Steve_Eastwood_Landuse \Plant_Biosecurity_Project\\ArcGIS_Online.gdb\\Holdings_Property_Merge' , 'LU_ALUMMaj')
File "C:\Users\hawkinle\Desktop\STDTAS\Unique_Data.py", line 4, in unique_values
with arcpy.da.SearchCursor(table, [field]) as cursor:
RuntimeError: cannot open 'N:\\GISProjects\\Steve_Eastwood_Landuse\\Plant_Biosecurity_Project\\ArcGIS_Online.gdb\\Holdings_Property_Merge'
[Finalizado em 8.0s com código de saída 1]
Suponho, pela leitura que fiz, que isso se refere à configuração do env.workspace?
fonte
env.workspace
eu acho. Tente tirar or
antes do caminho ou altere o\` to
`no caminho (e deixe or
lá). Esse geodatabase existe?[1,2,2,2,3,4]
, você está tentando retornar[1,2,3,4]
. Atualize a postagem para incluir essas informações.Respostas:
Você já conseguiu, basta especificar o nome dos seus parâmetros
table
efield
na sua definição de função e depois passar esses valores quando chamar a função. Observe também o seu recuo, pois é vital para o Python.Basicamente, isso significa que, quando você chama a função,
unique_values()
passa valores para dois parâmetros, um chamadotable
e outro chamadofield
. Estes são então utilizados na sua função. Quando você chama a função, na linhavocê está passando os valores para esses parâmetros.
É o mesmo que declarar seus parâmetros separadamente e transmiti-los diretamente ao cursor:
fonte
set(['a', 'b', 'a', 'b'])
, ele retornará valores únicos{'a', 'b'}
. O uso desorted()
apenas retorna-os na ordem classificada, pois um conjunto simples não é classificado.Eu recomendaria o uso da
set()
função interna do Python, juntamente com uma expressãoSearchCursor
como gerador, para encontrar os valores exclusivos. Você encontrará essa abordagem extremamente eficiente com conjuntos de dados grandes ou pequenos:fonte
A abordagem a seguir foi publicada em https://arcpy.wordpress.com/2012/02/01/create-a-list-of-unique-field-values/ Ela está usando arcpy e numpy e tem uma pegada de memória menor que a Abordagem SearchCursor.
fonte
Sei que é uma pergunta antiga, mas deixarei aqui para quem se deparar com isso procurando ajuda. O uso
arcpy.Frequency_analysis()
rápido coloca todos os valores exclusivos de um campo em uma nova tabela, que você pode usar para operações do cursor. Um único comando para fazer o que todas essas outras soluções fazem, de maneira mais rápida e fácil. Como bônus, você também conta quantas vezes cada valor aparece.fonte