Попытка извлечь список уникальных значений из поля, используя 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.workspace?

Просто доказательство того, что оно существует

Лейт Хокинс
источник
1
Пожалуйста , измените ваш вопрос , чтобы включить весь текст сообщения об ошибке (как текст)
Midavalo
Ваша новая ошибка не должна иметь ничего общего с тем, что env.workspaceя не думаю. Попробуйте либо снять rпуть перед путем, либо изменить \` to `в пути (и оставить rтам). Эта база геоданных существует?
Midavalo
Вы пытаетесь изолировать все уникальные значения в поле? Например, скажем, у вас есть следующие значения [1,2,2,2,3,4], вы пытаетесь вернуть [1,2,3,4]. Пожалуйста, обновите пост, чтобы включить эту информацию.
Аарон
@Midavalo ты имел в виду изменение пути tolook как это R'n: GISProjects _Landuse Plant_Biosecurity_Project ArcGIS_Online.gdb Holdings_Property_Merge», 'LU_ALUMMaj'
Лейт Hawkins
1
Спасибо - еще одно доказательство того, что я не очень умен, но я могу поднимать тяжелые вещи. Я в долгу перед тобой !!
Лейт Хокинс

Ответы:

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
Мидавало
источник
Ах, это имеет смысл, когда вы включаете отдельные параметры ниже, я получаю то, что вы говорите, спасибо! , Я знаю, продвигаясь вверх по цепочке ошибок, поскольку я получаю ошибку времени выполнения, которая не позволяет мне открыть существующую базу данных. Я обновлю свой вопрос.
Лейт Хокинс
Почему строка sorted () возвращает только один уникальный экземпляр каждого значения, когда функция sorted () возвращает дубликаты, если вы запускаете ее в простом списке, таком как ['a', 'b', 'a', 'b']? Я использовал этот ответ в течение некоторого времени и понял, что не понимаю, почему он работает.
Дилан Варбург
2
@DylanWarburg Поскольку вы не передаете список значений, вы передаете набор . Если вы добавите элементы списка выше в набор, например set(['a', 'b', 'a', 'b']), он будет возвращать уникальные значения {'a', 'b'}. Использование sorted()просто возвращает их в отсортированном порядке, так как простой набор не отсортирован.
Мидавало
Если поле, в котором вы ищете уникальные значения, не является строкой, вы должны добавить: return sorted ({str (row [0]) для строки в курсоре})
MKelly
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 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)
Saleika
источник
0

Я знаю, что это старый вопрос, но я оставлю это здесь для любого, кто наткнется на это в поисках помощи. Использование arcpy.Frequency_analysis()быстро помещает все уникальные значения из поля в новую таблицу, которую затем можно использовать для операций с курсором. Одна команда, чтобы сделать то, что делают все эти другие решения, быстрее и проще. В качестве бонуса вы также получаете счетчик того, сколько раз появляется каждое значение.

Колин Ланг
источник