Essayer d'extraire une liste de valeurs uniques à partir d'un champ à l'aide de python

11

J'ai un certain nombre de colonnes dans un certain nombre de tables dans un FGDB où j'ai besoin d'extraire les valeurs uniques de chaque colonne.

Par exemple: les valeurs peuvent être [1,2,2,2,3,4], et j'essaie de retourner [1,2,3,4]

Je pourrais faire ce travail de plusieurs autres façons dans ARCGIS mais j'essaie de m'étendre.

J'ai trouvé un morceau de python sur le Web qui, je pense, fera l'affaire, mais j'ai du mal à le faire fonctionner (je reçois toujours une erreur de syntaxe non valide comme je reçois toujours l'erreur de syntaxe à la ligne 3), ce sera sans aucun doute une erreur utilisateur très simple.

Extrait de code ci-dessous

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

Voici le message d'erreur que je reçois d'un texte 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]

Mises à jour de la question d'origine

J'ai maintenant mis à jour mon code avec la réponse fournie ci-dessous mais je reçois une erreur secondaire.

Nouvel extrait de code:

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)

Je reçois un nouveau message d'erreur lié à une erreur d'exécution

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'

[Terminé en 8.0s avec le code de sortie 1]

Je suppose que d'après la lecture que j'ai faite, cela concerne la configuration de l'espace de travail env.

Juste en montrant la preuve qu'elle existe

Leith Hawkins
la source
1
veuillez modifier votre question pour inclure l'intégralité de votre message d'erreur (sous forme de texte)
Midavalo
Votre nouvelle erreur ne devrait avoir rien à voir avec le env.workspaceje ne pense pas. Essayez soit d'enlever l' ravant du chemin, soit de changer le \` to `dans le chemin (et de le laisser rlà). Cette géodatabase existe-t-elle?
Midavalo
Essayez-vous d'isoler toutes les valeurs uniques d'un champ? Par exemple, supposons que vous ayez les valeurs suivantes [1,2,2,2,3,4], essayez-vous de revenir [1,2,3,4]. Veuillez mettre à jour le message pour inclure ces informations.
Aaron
@Midavalo vouliez-vous dire que vous deviez changer le chemin comme ceci? R'N: GISProjects _Landuse Plant_Biosecurity_Project ArcGIS_Online.gdb Holdings_Property_Merge ',' LU_ALUMMaj '
Leith Hawkins
1
Merci - preuve fruther que je ne suis pas très intelligent mais je peux soulever des choses lourdes. Je te dois un speights !!
Leith Hawkins

Réponses:

14

Vous l'avez à peu près compris, il vous suffit de spécifier le nom de vos paramètres tableet fielddans la définition de votre fonction, puis de transmettre ces valeurs lorsque vous appelez la fonction. Surveillez également votre retrait, car il est vital pour 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)

Fondamentalement, cela signifie que lorsque vous appelez la fonction, unique_values()vous passerez des valeurs à deux paramètres, l'un appelé table, l'autre appelé field. Ceux-ci sont ensuite utilisés dans votre fonction. Lorsque vous appelez la fonction, dans la ligne

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

vous transmettez les valeurs à ces paramètres.

Cela revient à déclarer vos paramètres séparément et à les passer directement au curseur:

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
la source
ahh c'est logique, lorsque vous incluez les paramètres individuels ci-dessous, je comprends ce que vous dites merci! . Je sais remonter la chaîne des erreurs car j'obtiens une erreur d'exécution qui ne me permet pas d'ouvrir la base de données existante. Je mettrai à jour ma question.
Leith Hawkins
Pourquoi la ligne sorted () renvoie-t-elle une seule instance unique de chaque valeur lorsque la fonction sorted () renvoie des doublons si vous l'exécutez sur une liste simple comme ['a', 'b', 'a', 'b']? J'utilise cette réponse depuis un certain temps et j'ai réalisé que je ne comprenais pas pourquoi cela fonctionne.
Dylan Warburg
2
@DylanWarburg Parce que vous ne transmettez pas une liste de valeurs, vous transmettez un ensemble . Si vous ajoutez vos éléments de liste ci-dessus à un ensemble, par exemple set(['a', 'b', 'a', 'b']), il renverra des valeurs uniques {'a', 'b'}. L'utilisation les sorted()renvoie simplement dans l'ordre trié car un ensemble simple n'est pas trié.
Midavalo
Si le champ à partir duquel vous recherchez des valeurs uniques n'est pas une chaîne, vous devez ajouter: return sorted ({str (row [0]) for row in cursor})
MKelly
8

Je conseillerais d'utiliser la fonction intégrée de Python set()avec une expressionSearchCursor comme générateur pour trouver les valeurs uniques. Vous trouverez cette approche extrêmement efficace avec des ensembles de données petits ou grands:

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
la source
1
C'est essentiellement ce que fait la réponse de @ Midavalo et les accolades {} sont utilisées pour définir un objet défini .
user2856
1
J'ai envisagé de suggérer exactement la même chose. Si ce que vous voulez est une liste, vous pouvez toujours reconvertir l'ensemble en une liste avec le python list () fx natif.
jbchurchill
3

L'approche suivante a été publiée sur https://arcpy.wordpress.com/2012/02/01/create-a-list-of-unique-field-values/ Elle utilise arcpy et numpy et a une empreinte mémoire plus petite que la Approche 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
la source
0

Je sais que c'est une vieille question, mais je vais laisser ceci ici à toute personne qui tombe dessus à la recherche d'aide. L'utilisation arcpy.Frequency_analysis()rapide place toutes les valeurs uniques d'un champ dans une nouvelle table, que vous pouvez ensuite utiliser pour les opérations de curseur. Une seule commande pour faire ce que font toutes ces autres solutions et plus rapidement et plus facilement. En prime, vous obtenez également un nombre de fois où chaque valeur apparaît.

Colin Lang
la source