Спроба витягти список унікальних значень із поля за допомогою python


11

У мене є ряд стовпців у ряді таблиць в межах FGDB, де мені потрібно отримати унікальні значення для кожного стовпця.

Наприклад: значення можуть бути [1,2,2,2,3,4], і я намагаюся повернути [1,2,3,4]

Я міг би виконати цю роботу багатьма іншими способами в ARCGIS, але я намагаюся розширити себе.

У Інтернеті я знайшов шматок python, який, на мою думку, зробить цю роботу, але я намагаюся його запустити (я постійно отримую помилкову помилку синтаксису, оскільки я продовжую отримувати помилку синтаксису в рядку 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'

[Готово через 8.0 с кодом виходу 1]

Я вважаю, що я прочитав, що це стосується встановлення простору env.works?

Просто показує доказ того, що воно існує


1
Будь ласка , змініть ваше запитання , щоб включити весь текст повідомлення про помилку (як текст)
Midavalo

Ваша нова помилка не повинна мати жодного відношення до того, що env.workspaceя не думаю. Спробуйте або зняти rпопередній шлях, або змінити \` to `на шляху (і залишити rтам). Чи існує така база даних геоданих?
Midavalo

Ви намагаєтесь виділити всі унікальні значення в полі? Наприклад, скажіть, що у вас є такі значення [1,2,2,2,3,4], чи намагаєтесь ви повернутись [1,2,3,4]. Оновіть публікацію, щоб включити цю інформацію.
Аарон

@Midavalo ти мав на увазі змінити такий погляд на шлях? R'N: GISProjects _Landuse Plant_Biosecurity_Project ArcGIS_Online.gdb Holdings_Property_Merge ',' LU_ALUMMaj '
Leith Hawkins

1
Спасибі - найсучасніший доказ того, що я не дуже розумний, але я можу підняти важкі речі. Я завдячую вам видовищами !!
Leith Hawkins

Відповіді:


14

Ви майже все це зрозуміли, вам просто потрібно вказати назву ваших параметрів tableта fieldу своєму визначенні функції, а потім передати ці значення під час виклику функції. Також слідкуйте за відступом, оскільки це важливо для 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)

В основному це говорить про те, що при виклику функції 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']? Я вже деякий час використовую цю відповідь і зрозумів, що не розумію, чому це працює.
Ділан Варбург

2
@DylanWarburg Оскільки ви не передаєте список значень, ви передаєте набір . Якщо ви додаєте елементи списку вище до набору, наприклад set(['a', 'b', 'a', 'b']), він поверне унікальні значення {'a', 'b'}. Використання sorted()просто повертає їх у відсортованому порядку, оскільки простий набір несортований.
Midavalo

Якщо поле, з якого ви шукаєте унікальні значення, не є рядком, слід додати: return sorted ({str (рядок [0]) для рядка в
курсорі

8

Я б порадив використовувати Python вбудований в set()функції поряд з SearchCursorяк вираз генератора , щоб знайти унікальні значення. Цей підхід ви вважаєте надзвичайно ефективним із великими чи малими наборами даних:

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, а також {} дужки використовуються для визначення заданого об'єкта .
user2856

1
Я вважав, що пропоную саме те саме. Якщо ви хочете - це список, ви завжди можете перетворити набір назад у список із нативним списком python () 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()швидко переносить усі унікальні значення з поля в нову таблицю, яку потім можна використовувати для операцій з курсором. Одна команда робити те, що всі ці інші рішення роблять, і швидше, і простіше. Як бонус ви також отримуєте підрахунок, скільки разів з’являється кожне значення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.