Prova di estrarre un elenco di valori univoci da un campo usando Python


11

Ho un numero di colonne in un numero di tabelle all'interno di un FGDB in cui ho bisogno di estrarre i valori univoci per ogni colonna.

Ad esempio: i valori possono essere [1,2,2,2,3,4] e sto cercando di restituire [1,2,3,4]

Potrei fare questo lavoro in molti altri modi in ARCGIS ma sto cercando di estendermi.

Ho trovato un pezzo di Python sul web che penso farà il lavoro ma sto lottando per farlo funzionare (continuo a ricevere un errore di sintassi non valido mentre continuo a ricevere l'errore di sintassi nella riga 3) questo sarà senza dubbio un errore utente molto semplice.

Snippet di codice di seguito

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

Questo è il messaggio di errore che ottengo dal testo 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]

Aggiornamenti dalla domanda originale

Ora ho aggiornato il mio codice con la risposta fornita di seguito, ma sto ricevendo un errore secondario.

Nuovo frammento di codice:

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)

Ricevo un nuovo messaggio di errore relativo a un errore di runtime

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'

[Terminato in 8.0s con il codice di uscita 1]

Presumo dalla lettura che ho fatto che ciò si riferisce all'impostazione di env.workspace?

Sto solo dimostrando che esiste


1
Si prega di modificare la tua domanda per includere il tuo messaggio intero di errore (come testo)
Midavalo

Il tuo nuovo errore non dovrebbe avere niente a che fare con il env.workspacenon credo. Prova a togliere il rprecedente al percorso o a cambiare il \` to `nel percorso (e lascia il rlì). Esiste quel Geodatabase?
Midavalo

Stai cercando di isolare tutti i valori univoci in un campo? Ad esempio, supponiamo che tu abbia i seguenti valori [1,2,2,2,3,4], stai provando a tornare [1,2,3,4]. Aggiorna il post per includere queste informazioni.
Aaron

@Midavalo intendevi cambiare il percorso in questo modo? R'N: GISProjects _Landuse Plant_Biosecurity_Project ArcGIS_Online.gdb Holdings_Property_Merge ',' LU_ALUMMaj '
Leith Hawkins

1
Grazie - prova schietta che non sono molto intelligente ma posso sollevare cose pesanti. Ti devo uno speights !!
Leith Hawkins,

Risposte:


14

Hai praticamente capito, devi solo specificare il nome dei tuoi parametri tablee fieldnella definizione della tua funzione, quindi passare quei valori quando chiami la funzione. Guarda anche il tuo rientro, poiché è vitale per 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)

Fondamentalmente questo sta dicendo che quando chiami la funzione unique_values()passerai i valori a due parametri, uno chiamato table, l'altro chiamato field. Questi vengono quindi utilizzati nella tua funzione. Quando si chiama la funzione, nella linea

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

stai passando i valori a questi parametri.

Ciò equivale a dichiarare i parametri separatamente e passarli direttamente al cursore:

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

ahh ha senso, quando includi i singoli parametri qui sotto ho capito cosa stai dicendo grazie! . So che sto salendo la catena di errori mentre ricevo un errore di runtime che non mi consente di aprire il database esistente. Aggiornerò la mia domanda.
Leith Hawkins,

Perché la riga sort () restituisce solo un'istanza univoca di ciascun valore quando la funzione sort () restituisce duplicati se lo si esegue in un elenco semplice come ['a', 'b', 'a', 'b']? Sto usando questa risposta da un po 'di tempo e ho capito che non capivo perché funzionasse.
Dylan Warburg,

2
@DylanWarburg Poiché non stai passando un elenco di valori, stai passando un set . Se aggiungi gli elementi dell'elenco sopra a un set, ad esempio set(['a', 'b', 'a', 'b']), restituirà valori univoci {'a', 'b'}. L'utilizzo sorted()li restituisce semplicemente nell'ordine in cui un set semplice non è ordinato.
Midavalo

Se il campo da cui stai cercando valori univoci non è una stringa, devi aggiungere: return ordinato ({str (riga [0]) per riga nel cursore})
MKelly

8

Consiglierei di usare la funzione integrata di Python set()insieme a SearchCursorcome espressione di generatore per trovare i valori univoci. Troverai questo approccio estremamente efficiente con set di dati grandi o piccoli:

import arcpy

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

unique_values = set(row[0] for row in arcpy.da.SearchCursor(fc, "some_field"))

1
Questo è essenzialmente ciò che sta facendo la risposta di @ Midavalo e le parentesi graffe {} vengono utilizzate per definire un oggetto set .
user2856

1
Ho considerato di suggerire la stessa identica cosa. Se quello che vuoi è un elenco, puoi sempre riportare il set in un elenco con il Python list nativo () fx.
jbchurchill,

3

Il seguente approccio è stato pubblicato su https://arcpy.wordpress.com/2012/02/01/create-a-list-of-unique-field-values/ Sta usando arcpy e numpy e ha un footprint di memoria inferiore rispetto al Approccio 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)

0

So che è una vecchia domanda, ma la lascerò qui per chiunque si imbatta in questa ricerca di aiuto. L'utilizzo arcpy.Frequency_analysis()rapido inserisce tutti i valori univoci di un campo in una nuova tabella, che è quindi possibile utilizzare per le operazioni del cursore. Un solo comando per fare ciò che fanno tutte queste altre soluzioni e più velocemente e più facilmente. Come bonus, ottieni anche un conteggio di quante volte appare ogni valore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.