尝试使用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'
利思霍金斯

1
谢谢-进一步证明我不是很聪明,但是我可以举起沉重的东西。我欠你很多!!
蕾丝·霍金斯

Answers:


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

嗯,这很有意义,当您在下面包括各个参数时,我会明白您的意思!。我知道随着运行时错误的出现,错误链上移了,这不允许我打开现有数据库。病态更新我的问题。
蕾丝·霍金斯

如果在诸如['a','b','a','b']之类的简单列表上运行sorted()函数返回重复项时,为什么sorted()行仅返回每个值的唯一实例?我已经使用此回复一段时间了,并且意识到我不明白它为什么起作用。
迪伦·沃伯格

2
@DylanWarburg因为未传递值列表,所以正在传递set。例如set(['a', 'b', 'a', 'b']),如果将上面的列表项添加到集合中,它将返回唯一值{'a', 'b'}。使用sorted()just会按排序顺序返回它们,因为一个简单的集合没有排序。
Midavalo

如果您要从中查找唯一值的字段不是字符串,则应添加:return sorted({str(row [0])表示光标所在的行})
MKelly,

8

我建议使用Python的内置set()函数以及a 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的答案,以及{}花括号用于定义set对象
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)

0

我知道这是一个老问题,但是我会把这个问题留给所有偶然发现此问题的人。arcpy.Frequency_analysis()快速使用会将字段中的所有唯一值放入新表中,然后可将其用于光标操作。一个命令即可完成所有其他解决方案的工作,并且变得更快,更容易。作为奖励,您还可以计算每个值出现多少次。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.