Спроба витягти список унікальних значень із поля за допомогою 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.