Tentando extrair uma lista de valores exclusivos de um campo usando python

11

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?

Apenas mostrando a prova de que existe

Leith Hawkins
fonte
11
por favor edite sua pergunta para incluir a sua mensagem inteira de erro (como texto)
Midavalo
Seu novo erro não deve ter nada a ver com o que env.workspaceeu acho. Tente tirar o rantes do caminho ou altere o \` to `no caminho (e deixe o rlá). Esse geodatabase existe?
Midavalo
Você está tentando isolar todos os valores exclusivos em um campo? Por exemplo, digamos que você tenha os seguintes valores [1,2,2,2,3,4], você está tentando retornar [1,2,3,4]. Atualize a postagem para incluir essas informações.
Aaron
@Midavalo fez você significava mudar o tolook caminho como este R'n:? GISProjects _Landuse Plant_Biosecurity_Project ArcGIS_Online.gdb Holdings_Property_Merge', 'LU_ALUMMaj'
Leith Hawkins
11
Obrigado - prova de que não sou muito inteligente, mas posso levantar coisas pesadas. Devo-lhe um discursos !!
Leith Hawkins

Respostas:

14

Você já conseguiu, basta especificar o nome dos seus parâmetros tablee fieldna 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.

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)

Basicamente, isso significa que, quando você chama a função, unique_values()passa valores para dois parâmetros, um chamado tablee outro chamado field. Estes são então utilizados na sua função. Quando você chama a função, na linha

myValues = unique_values(r'N:\GISProjects\Landuse\Plant_Biosecurity_Project\ArcGIS_Online.gdb\Holdings_Property_Merge' , 'LU_ALUMMaj')  

você está passando os valores para esses parâmetros.

É o mesmo que declarar seus parâmetros separadamente e transmiti-los diretamente ao cursor:

table = r'N:\GISProjects\Landuse\Plant_Biosecurity_Project\ArcGIS_Online.gdb\Holdings_Property_Merge'
field = 'LU_ALUMMaj'

with arcpy.da.SearchCursor(table, [field]) as cursor:
    myValues = sorted({row[0] for row in cursor})

print myValues
Midavalo
fonte
ahh isso faz sentido, quando você inclui os parâmetros individuais abaixo, entendo o que você está dizendo obrigado! . Eu sei mover a cadeia de erros, pois estou recebendo um erro de tempo de execução que não está permitindo que eu abra o banco de dados existente. Vou atualizar minha pergunta.
Leith Hawkins
Por que a linha classificada () retorna apenas uma instância exclusiva de cada valor quando a função classificada () retorna duplicatas se você a executa em uma lista simples como ['a', 'b', 'a', 'b']? Uso essa resposta há algum tempo e percebi que não entendia por que ela funciona.
Dylan Warburg
2
@DylanWarburg Como você não está passando uma lista de valores, está passando um conjunto . Se você adicionar os itens da lista acima a um conjunto, por exemplo set(['a', 'b', 'a', 'b']), ele retornará valores únicos {'a', 'b'}. O uso de sorted()apenas retorna-os na ordem classificada, pois um conjunto simples não é classificado.
Midavalo
Se o campo que você está procurando valores exclusivos de não é uma string, você deve adicionar: retorno classificadas ({str (row [0]) para linha no cursor})
MKelly
8

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:

import arcpy

fc = r'C:\path\to\your.gdb\featureclass'

unique_values = set(row[0] for row in arcpy.da.SearchCursor(fc, "some_field"))
Aaron
fonte
11
Isso é essencialmente o que a resposta do @ Midavalo está fazendo, assim como as chaves {} estão sendo usadas para definir um objeto definido .
user2856
11
Eu considerei sugerir exatamente a mesma coisa. Se o que você quer é uma lista, você sempre pode transformar o conjunto novamente em uma lista com o python nativo list () fx.
precisa saber é o seguinte
3

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.

import arcpy
import numpy

def unique_values(table , field):
    data = arcpy.da.TableToNumPyArray(table, [field])
    return numpy.unique(data[field]).tolist()

myValues = unique_values(r'N:\GISProjects\Landuse\Plant_Biosecurity_Project\ArcGIS_Online.gdb\Holdings_Property_Merge' , 'LU_ALUMMaj')

print (myValues)
Saleika
fonte
0

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.

Colin Lang
fonte