Intentando extraer una lista de valores únicos de un campo usando python

11

Tengo varias columnas en varias tablas dentro de un FGDB donde necesito extraer los valores únicos para cada columna.

Por ejemplo: los valores pueden ser [1,2,2,2,3,4], y estoy tratando de devolver [1,2,3,4]

Podría hacer este trabajo de muchas otras maneras en ARCGIS, pero estoy tratando de extenderme.

He encontrado una pieza de python en la web que creo que hará el trabajo, pero estoy luchando para que se ejecute (sigo obteniendo un error de sintaxis no válido mientras sigo obteniendo el error de sintaxis en la línea 3). Un error de usuario realmente simple.

Fragmento de código a continuación

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})

Este es el mensaje de error que recibo del 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]

Actualizaciones de la pregunta original

Ahora he actualizado mi código con la respuesta proporcionada a continuación, pero recibo un error secundario.

Nuevo fragmento 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)

Recibo un nuevo mensaje de error relacionado con un error de tiempo de ejecución

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'

[Terminado en 8.0s con código de salida 1]

Asumo por la lectura que he hecho que esto se relaciona con la configuración del espacio de trabajo env.

Solo mostrando una prueba de que existe

Leith Hawkins
fuente
1
Por favor, editar su pregunta para incluir su mensaje completo de error (como texto)
Midavalo
Su nuevo error no debería tener nada que ver con env.workspacelo que no creo. Intenta despegar rantes del camino o cambiar el \` to `en el camino (y deja el rallí). ¿Existe esa geodatabase?
Midavalo
¿Estás tratando de aislar todos los valores únicos en un campo? Por ejemplo, supongamos que tiene los siguientes valores [1,2,2,2,3,4], ¿está tratando de devolver [1,2,3,4]? Actualice la publicación para incluir esta información.
Aaron
@Midavalo, ¿quiso decir cambiar el camino para que parezca así? R'N: GISProjects _Landuse Plant_Biosecurity_Project ArcGIS_Online.gdb Holdings_Property_Merge ',' LU_ALUMMaj '
Leith Hawkins
1
Gracias, una prueba más de que no soy muy inteligente, pero puedo levantar cosas pesadas. ¡Te debo un speights!
Leith Hawkins el

Respuestas:

14

Ya lo tiene, solo necesita especificar el nombre de sus parámetros tabley fielden la definición de su función, y luego pasar esos valores cuando llame a la función. También observe su sangría, ya que es vital para 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)

Básicamente, esto significa que cuando llama a la función unique_values()pasará valores a dos parámetros, uno llamado table, el otro llamado field. Estos se utilizan en su función. Cuando llamas a la función, en la línea

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

Está pasando los valores a estos parámetros.

Esto es lo mismo que declarar sus parámetros por separado y pasarlos directamente al 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
fuente
Ah, eso tiene sentido, cuando incluyes los parámetros individuales a continuación, ¡entiendo lo que dices gracias! . Sé que estoy avanzando en la cadena de errores, ya que recibo un error de tiempo de ejecución que no me permite abrir la base de datos existente. Actualizaré mi pregunta.
Leith Hawkins el
¿Por qué la línea sorted () devuelve solo una instancia única de cada valor cuando la función sorted () devuelve duplicados si la ejecuta en una lista simple como ['a', 'b', 'a', 'b']? He estado usando esta respuesta durante algún tiempo y me di cuenta de que no entendía por qué funciona.
Dylan Warburg el
2
@DylanWarburg Debido a que no está pasando una lista de valores, está pasando un conjunto . Si agrega los elementos de su lista a un conjunto, por ejemplo set(['a', 'b', 'a', 'b']), devolverá valores únicos {'a', 'b'}. El uso sorted()solo los devuelve en orden ordenado ya que un conjunto simple no está ordenado.
Midavalo
Si el campo del que está buscando valores únicos no es una cadena, debe agregar: return sorted ({str (row [0]) for fila in cursor})
MKelly
8

Aconsejaría usar la función incorporada de Python set()junto con a SearchCursorcomo una expresión generadora para encontrar los valores únicos. Este enfoque le resultará extremadamente eficiente con conjuntos de datos grandes o pequeños:

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
fuente
1
Esto es esencialmente lo que está haciendo la respuesta de @Midavalo, así como las {} llaves se utilizan para definir un objeto establecido .
usuario2856
1
Pensé en sugerir exactamente lo mismo. Si lo que desea es una lista, siempre puede convertir el conjunto nuevamente en una lista con la lista nativa de python list () fx.
jbchurchill
3

El siguiente enfoque fue publicado en https://arcpy.wordpress.com/2012/02/01/create-a-list-of-unique-field-values/ Está utilizando arcpy y numpy y tiene una huella de memoria menor que la Enfoque del cursor de búsqueda.

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
fuente
0

Sé que es una vieja pregunta, pero dejaré esto aquí para cualquiera que se encuentre con esto buscando ayuda. Usar arcpy.Frequency_analysis()rápidamente coloca todos los valores únicos de un campo en una nueva tabla, que luego puede usar para las operaciones del cursor. Un solo comando para hacer lo que hacen todas estas otras soluciones y más rápido y más fácil. Como beneficio adicional, también obtienes un recuento de cuántas veces aparece cada valor.

Colin Lang
fuente