파이썬을 사용하여 필드에서 고유 값 목록을 추출하려고합니다.


11

FGDB 내부의 여러 테이블에 여러 열이 있으며 각 열의 고유 값을 추출해야합니다.

예를 들어 : 값이 [1,2,2,2,3,4] 일 수 있으며 [1,2,3,4]를 반환하려고합니다.

이 작업을 ARCGIS에서 여러 가지 다른 방법으로 수행 할 수는 있지만 스스로 확장하려고합니다.

웹에서 파이썬 조각을 발견했지만 작업을 수행 할 것이라고 생각하지만 실행하기 위해 고심하고 있습니다 (3 행에서 구문 오류가 계속 발생하면 잘못된 구문 오류가 계속 발생합니다). 정말 간단한 사용자 오류입니다.

아래 코드 스 니펫

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

이것은 숭고한 텍스트에서 얻은 오류 메시지입니다.

 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]

원래 질문의 업데이트

이제 아래에서 제공 한 답변으로 코드를 업데이트했지만 보조 오류가 발생합니다.

새로운 코드 스 니펫 :

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)

런타임 오류와 관련된 새로운 오류 메시지가 나타납니다

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'

[종료 코드 1을 사용하여 8.0에서 완료]

나는 읽은 내용에서 env.workspace 설정과 관련이 있다고 가정합니다.

그것이 존재한다는 증거를 보여주는 것


1
제발 편집 (텍스트) 전체 오류 메시지 포함하도록 질문을
Midavalo

당신의 새로운 오류는 env.workspace생각하지 않는 것과 관련 이 없습니다. r경로 앞의 이륙을 하거나 경로에서 \` to `를 변경해 보십시오 r. 지오 데이터베이스가 존재합니까?
Midavalo

필드에서 모든 고유 값을 분리하려고합니까? 예를 들어, 다음과 같은 값을 가지고 있다고 [1,2,2,2,3,4]당신이 돌아 노력하고있다 [1,2,3,4]. 이 정보를 포함하도록 게시물을 업데이트하십시오.
Aaron

@Midavalo는 다음과 같이 경로를 변경하는 것을 의미 했습니까? GISProjects _Landuse Plant_Biosecurity_Project ArcGIS_Online.gdb Holdings_Property_Merge ','LU_ALUMMaj '
Leith Hawkins

1
고마워-똑똑하지는 않지만 무거운 것을 들어 올릴 수 있다는 진실한 증거. 나는 당신에게 speights를 빚지고 있습니다!
Leith Hawkins

답변:


14

당신은 그것을 거의 얻었으므로 매개 변수의 이름 tablefield함수 정의 를 지정하고 함수를 호출 할 때 해당 값을 전달하면됩니다. 파이썬에 꼭 필요한 들여 쓰기도 살펴보십시오.

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)

기본적으로 이것은 함수를 호출 할 때 unique_values()하나는이라는 table다른 하나는이라는 두 개의 매개 변수에 값을 전달한다는 의미 field입니다. 그런 다음 함수에서 사용됩니다. 함수를 호출하면 라인에서

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

이 매개 변수에 값을 전달합니다.

이는 매개 변수를 별도로 선언하고 커서에 직접 전달하는 것과 같습니다.

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

당신이 아래의 개별 매개 변수를 포함 할 때 나는 당신이 말하고있는 것을 얻습니다. . 기존 데이터베이스를 열 수없는 런타임 오류가 발생하여 오류 체인을 이동하는 것으로 알고 있습니다. 내 질문을 업데이트하겠습니다.
Leith Hawkins

sorted () 함수가 [ 'a', 'b', 'a', 'b']와 같은 간단한 목록에서 실행할 경우 sorted () 함수가 중복을 반환 할 때 sorted () 행이 각 값의 고유 한 인스턴스 하나만 반환하는 이유는 무엇입니까? 나는이 답변을 얼마 동안 사용해 왔으며 왜 그것이 효과가 있는지 이해하지 못한다는 것을 깨달았습니다.
Dylan Warburg

2
@DylanWarburg 값 목록 을 전달하지 않기 때문에 set을 전달합니다 . 예를 들어 위의 목록 항목을 세트에 추가하면 set(['a', 'b', 'a', 'b'])고유 한 값이 반환됩니다 {'a', 'b'}. sorted()간단한 집합이 정렬되지 않았으므로 사용하면 정렬 된 순서로 반환합니다.
Midavalo

고유 한 값을 찾는 필드가 문자열이 아닌 경우 다음을 추가해야합니다. return sorted ({커서의 행에 대해 {str (row [0])})
MKelly

8

내가 사용 권합니다 파이썬의 내장 set()A를 함께 기능 SearchCursorA와 발전기 표현 고유 값을 찾을 수 있습니다. 이 방법은 크거나 작은 데이터 세트에서 매우 효율적입니다.

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
이것은 본질적으로 @Midavalo의 답변 이하고 {} 괄호가 set 객체 를 정의하는 데 사용되는 것 입니다.
user2856

1
나는 똑같은 것을 제안하는 것을 고려했다. 원하는 것이 목록이라면 항상 기본 파이썬 list () fx를 사용하여 목록을 다시 목록으로 바꿀 수 있습니다.
jbchurchill

3

다음 접근법은 https://arcpy.wordpress.com/2012/02/01/create-a-list-of-unique-field-values/ 에 게시되었습니다. arcpy와 numpy를 사용하고 있으며 메모리 사용량이 적습니다. 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

나는 그것이 오래된 질문이라는 것을 알고 있지만, 도움을 찾고있는 사람을 위해 이것을 여기에 남겨 둘 것입니다. 를 사용하면 arcpy.Frequency_analysis()필드의 모든 고유 값을 새 테이블에 빠르게 저장 한 다음 커서 작업에 사용할 수 있습니다. 다른 모든 솔루션의 기능을 빠르고 쉽게 수행 할 수있는 단일 명령입니다. 보너스로 각 값이 몇 번 표시되는지 계산됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.