Es wird versucht, mit Python eine Liste eindeutiger Werte aus einem Feld zu extrahieren


11

Ich habe eine Reihe von Spalten in einer Reihe von Tabellen innerhalb einer REA, in denen ich die eindeutigen Werte für jede Spalte extrahieren muss.

Zum Beispiel: Die Werte können [1,2,2,2,3,4] sein, und ich versuche, [1,2,3,4] zurückzugeben.

Ich könnte diesen Job in ARCGIS auf verschiedene andere Arten erledigen, aber ich versuche mich zu erweitern.

Ich habe ein Stück Python im Web gefunden, von dem ich denke, dass es den Job erledigen wird, aber ich habe Probleme, es zum Laufen zu bringen (ich bekomme immer wieder einen ungültigen Syntaxfehler, da ich immer wieder den Syntaxfehler in Zeile 3 bekomme). Dies wird zweifellos sein Ein wirklich einfacher Benutzerfehler.

Code-Snippet unten

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

Dies ist die Fehlermeldung, die ich aus erhabenem Text erhalte:

 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]

Aktualisierungen von der ursprünglichen Frage

Ich habe jetzt meinen Code mit der unten angegebenen Antwort aktualisiert, erhalte jedoch einen sekundären Fehler.

Neues Code-Snippet:

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)

Ich erhalte eine neue Fehlermeldung im Zusammenhang mit einem Laufzeitfehler

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'

[Fertig in 8.0s mit Exit Code 1]

Ich gehe davon aus, dass dies mit dem Festlegen des env.workspace zusammenhängt.

Ich zeige nur den Beweis, dass es existiert


1
Bitte bearbeiten Sie Ihre Frage, um Ihre gesamte Fehlermeldung (als Text) aufzunehmen
Midavalo

Ihr neuer Fehler sollte nichts mit dem zu tun haben, was env.workspaceich nicht glaube. Versuchen Sie entweder das rvor dem Pfad abzunehmen oder das \` to `im Pfad zu ändern (und lassen Sie das rdort). Existiert diese Geodatabase?
Midavalo

Versuchen Sie, alle eindeutigen Werte in einem Feld zu isolieren? Angenommen, Sie haben die folgenden Werte [1,2,2,2,3,4], versuchen Sie zurückzukehren [1,2,3,4]. Bitte aktualisieren Sie den Beitrag, um diese Informationen aufzunehmen.
Aaron

@Midavalo meinten Sie, den Pfad so zu ändern? R'N: GISProjects _Landuse Plant_Biosecurity_Project ArcGIS_Online.gdb Holdings_Property_Merge ',' LU_ALUMMaj '
Leith Hawkins

1
Danke - ein weiterer Beweis dafür, dass ich nicht sehr schlau bin, aber ich kann schwere Dinge heben. Ich schulde dir einen Speights !!
Leith Hawkins

Antworten:


14

Sie haben es so ziemlich verstanden, Sie müssen nur den Namen Ihrer Parameter tableund fieldin Ihrer Funktionsdefinition angeben und diese Werte dann übergeben, wenn Sie die Funktion aufrufen. Achten Sie auch auf Ihre Einrückung, da dies für Python von entscheidender Bedeutung ist.

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)

Grundsätzlich bedeutet dies, dass Sie beim Aufrufen der Funktion unique_values()Werte an zwei Parameter übergeben, einen aufgerufenen tableund einen aufgerufenen field. Diese werden dann in Ihrer Funktion verwendet. Wenn Sie die Funktion aufrufen, in der Zeile

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

Sie übergeben die Werte an diese Parameter.

Dies entspricht dem separaten Deklarieren Ihrer Parameter und dem direkten Übergeben an den 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

ahh das macht Sinn, wenn Sie die einzelnen Parameter unten angeben, verstehe ich, was Sie sagen, danke! . Ich weiß, dass ich die Fehlerkette nach oben verschieben muss, da ein Laufzeitfehler angezeigt wird, der es mir nicht ermöglicht, die vorhandene Datenbank zu öffnen. Ich werde meine Frage aktualisieren.
Leith Hawkins

Warum gibt die Zeile sortiert () nur eine eindeutige Instanz jedes Werts zurück, wenn die Funktion sortiert () Duplikate zurückgibt, wenn Sie sie in einer einfachen Liste wie ['a', 'b', 'a', 'b'] ausführen? Ich benutze diese Antwort seit einiger Zeit und habe festgestellt, dass ich nicht verstanden habe, warum sie funktioniert.
Dylan Warburg

2
@DylanWarburg Weil Sie nicht ein vorübergehendes Liste von Werten, sind vorbei Sie einen Satz . Wenn Sie Ihre Listenelemente oben zu einem Satz hinzufügen, z. B. set(['a', 'b', 'a', 'b'])werden eindeutige Werte zurückgegeben {'a', 'b'}. Wenn Sie sorted()just verwenden, werden sie in sortierter Reihenfolge zurückgegeben, da ein einfacher Satz unsortiert ist.
Midavalo

Wenn das Feld, nach dem Sie nach eindeutigen Werten suchen, keine Zeichenfolge ist, sollten Sie
Folgendes

8

Ich würde empfehlen, die integrierte set()Funktion von Python zusammen mit einem SearchCursorals Generatorausdruck zu verwenden, um die eindeutigen Werte zu finden. Sie finden diesen Ansatz bei großen oder kleinen Datensätzen äußerst effizient:

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
Dies ist im Wesentlichen die Antwort von @ Midavalo, und die Klammern {} werden zum Definieren eines festgelegten Objekts verwendet .
user2856

1
Ich überlegte, genau dasselbe vorzuschlagen. Wenn Sie eine Liste wünschen, können Sie das Set jederzeit wieder in eine Liste mit dem nativen Python list () fx umwandeln.
jbchurchill

3

Der folgende Ansatz wurde unter https://arcpy.wordpress.com/2012/02/01/create-a-list-of-unique-field-values/ veröffentlicht. Er verwendet arcpy und numpy und hat einen geringeren Speicherbedarf als der SearchCursor-Ansatz.

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

Ich weiß, dass es eine alte Frage ist, aber ich werde dies hier jedem überlassen, der auf der Suche nach Hilfe über diese Frage stolpert. Durch die arcpy.Frequency_analysis()schnelle Verwendung werden alle eindeutigen Werte aus einem Feld in eine neue Tabelle eingefügt, die Sie dann für Cursoroperationen verwenden können. Ein einziger Befehl, um das zu tun, was all diese anderen Lösungen tun, und zwar schneller und einfacher. Als Bonus erhalten Sie auch eine Zählung, wie oft jeder Wert angezeigt wird.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.