พยายามแยกรายการของค่าที่ไม่ซ้ำออกจากเขตข้อมูลโดยใช้ python


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'

[เสร็จสิ้นใน 8.0 วินาทีด้วยรหัสออก 1]

ฉันถือว่าจากการอ่านที่ฉันได้ทำสิ่งนี้เกี่ยวข้องกับการตั้งค่า env.workspace หรือไม่

เพียงแสดงหลักฐานว่ามีอยู่จริง


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

เหตุใดบรรทัดที่เรียง () จึงส่งคืนอินสแตนซ์ที่ไม่ซ้ำกันเพียงหนึ่งเดียวของแต่ละค่าเมื่อฟังก์ชัน sort () ส่งคืนค่าซ้ำหากคุณเรียกใช้ในรายการอย่างง่ายเช่น ['a', 'b', 'a', 'b'] ฉันใช้คำตอบนี้มาระยะหนึ่งและรู้ตัวว่าฉันไม่เข้าใจว่าทำไมมันถึงได้ผล
Dylan Warburg

2
@DylanWarburg เพราะคุณไม่ได้ผ่านรายการของค่าที่คุณกำลังผ่านชุด ถ้าคุณเพิ่มรายการของคุณด้านบนเพื่อกำหนดเช่นนั้นก็จะคืนค่าที่ไม่ซ้ำกันset(['a', 'b', 'a', 'b']) {'a', 'b'}ใช้sorted()เพียงแค่ส่งกลับพวกเขาในการเรียงลำดับเป็นชุดที่เรียบง่ายไม่ได้เรียง
Midavalo

หากฟิลด์ที่คุณกำลังค้นหาค่าที่ไม่ซ้ำจากนั้นไม่ใช่สตริงคุณควรเพิ่ม: return
sort

8

ฉันจะแนะนำให้ใช้งูหลามของในตัว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 ของคำตอบที่จะทำเช่นเดียวกับ {} วงเล็บจะถูกใช้ในการกำหนดวัตถุชุด
2856

1
ฉันคิดว่าจะแนะนำสิ่งเดียวกัน หากสิ่งที่คุณต้องการคือรายการคุณสามารถเปลี่ยนการตั้งค่ากลับไปเป็นรายการด้วยรายการไพ ธ อลดั้งเดิม () 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.