Próba wyodrębnienia listy unikatowych wartości z pola za pomocą pytona


11

Mam kilka kolumn w wielu tabelach w FGDB, w których muszę wyodrębnić unikalne wartości dla każdej kolumny.

Na przykład: wartości mogą wynosić [1,2,2,2,3,4], a ja próbuję zwrócić [1,2,3,4]

Mógłbym wykonać tę pracę na wiele innych sposobów w ARCGIS, ale staram się rozszerzyć.

Znalazłem w sieci fragment pytona, który, jak sądzę, wykona zadanie, ale staram się go uruchomić (ciągle otrzymuję nieprawidłowy błąd składniowy, ponieważ ciągle pojawia się błąd składniowy w wierszu 3), to bez wątpienia będzie to bardzo prosty błąd użytkownika.

Fragment kodu poniżej

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

Oto komunikat o błędzie, który otrzymuję z wysublimowanego tekstu:

 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]

Aktualizacje z pierwotnego pytania

Zaktualizowałem teraz swój kod o odpowiedź podaną poniżej, ale otrzymuję drugi błąd.

Nowy fragment kodu:

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)

Otrzymuję nowy komunikat o błędzie związany z błędem środowiska wykonawczego

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'

[Zakończono w 8.0s kodem wyjścia 1]

Zakładam, że z lektury, którą wykonałem, wiąże się to z ustawieniem środowiska pracy?

Pokazuję tylko, że istnieje


1
Proszę edytować swoje pytanie obejmować cały komunikat o błędzie (jako tekst)
Midavalo

Twój nowy błąd nie powinien mieć nic wspólnego z env.workspacenie sądzę. Spróbuj albo zdjąć rprzed ścieżką, albo zmienić \` to `na ścieżce (i zostaw rtam). Czy ta geobaza istnieje?
Midavalo

Czy próbujesz wyodrębnić wszystkie unikalne wartości w polu? Załóżmy na przykład, że masz następujące wartości [1,2,2,2,3,4], czy próbujesz zwrócić [1,2,3,4]. Zaktualizuj post, aby uwzględnić te informacje.
Aaron

@Midavalo nie chodziło o zmianę tolook ścieżki takiego r'N: GISProjects _Landuse Plant_Biosecurity_Project ArcGIS_Online.gdb Holdings_Property_Merge”, 'LU_ALUMMaj'
Leith Hawkins

1
Dzięki - mocniejszy dowód, że nie jestem zbyt mądry, ale mogę podnosić ciężkie rzeczy. Jestem ci winien przemówienie !!
Leith Hawkins,

Odpowiedzi:


14

Prawie go masz, wystarczy podać nazwę swoich parametrów tablei fielddefinicję funkcji, a następnie przekazać te wartości po wywołaniu funkcji. Uważaj także na wcięcie, ponieważ jest to bardzo ważne dla Pythona.

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)

Zasadniczo oznacza to, że kiedy wywołujesz funkcję unique_values(), przekazujesz wartości do dwóch parametrów, jednego wywoływanego table, drugiego wywoływanego field. Są one następnie używane w twojej funkcji. Po wywołaniu funkcji w wierszu

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

przekazujesz wartości do tych parametrów.

Jest to to samo, co deklarowanie parametrów osobno i przekazywanie ich bezpośrednio do kursora:

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

Ach, to ma sens, jeśli podasz poniżej poszczególne parametry, otrzymam to, co mówisz, dziękuję! . Wiem, że przechodzę w górę łańcucha błędów, ponieważ otrzymuję błąd w czasie wykonywania, który nie pozwala mi otworzyć istniejącej bazy danych. Zaktualizuję moje pytanie.
Leith Hawkins

Dlaczego linia sorted () zwraca tylko jedno unikalne wystąpienie każdej wartości, gdy funkcja sorted () zwraca duplikaty, jeśli uruchomisz ją na prostej liście, takiej jak ['a', 'b', 'a', 'b']? Od jakiegoś czasu korzystam z tej odpowiedzi i zdałem sobie sprawę, że nie rozumiem, dlaczego to działa.
Dylan Warburg

2
@DylanWarburg Ponieważ nie przekazujesz listy wartości, przekazujesz zestaw . Jeśli dodasz elementy listy powyżej do zestawu, np set(['a', 'b', 'a', 'b']). Zwróci unikalne wartości {'a', 'b'}. Użycie sorted()tylko zwraca je w posortowanej kolejności, ponieważ prosty zestaw nie jest posortowany.
Midavalo

Jeśli pole, od którego szukasz unikalnych wartości, nie jest łańcuchem, powinieneś dodać: return sorted ({str (wiersz [0]) dla wiersza w kursorze})
MKelly

8

Radziłbym użyciu Pythona wbudowanej set()funkcji wraz z SearchCursorpostaci wyrażenia generatora , aby znaleźć unikalne wartości. Przekonasz się, że to podejście jest wyjątkowo skuteczne w przypadku dużych lub małych zestawów danych:

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
Zasadniczo właśnie to robi odpowiedź @ Midavalo, a nawiasy klamrowe {} są używane do definiowania zestawu obiektów .
user2856,

1
Zastanawiałem się nad zasugerowaniem dokładnie tego samego. Jeśli potrzebujesz listy, zawsze możesz zmienić zestaw z powrotem w listę za pomocą natywnej listy python list ().
jbchurchill

3

Poniższe podejście zostało opublikowane na https://arcpy.wordpress.com/2012/02/01/create-a-list-of-unique-field-values/ Korzysta z arcpy i numpy i ma mniejszą pamięć niż pamięć Podejście 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

Wiem, że to stare pytanie, ale zostawię to tutaj każdemu, kto natknie się na to i szuka pomocy. Używanie arcpy.Frequency_analysis()szybko powoduje umieszczenie wszystkich unikalnych wartości z pola w nowej tabeli, której można następnie użyć do operacji kursora. Jedno polecenie, aby zrobić to, co robią wszystkie pozostałe rozwiązania, szybciej i łatwiej. Jako bonus otrzymasz także liczbę wyświetleń każdej wartości.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.