Mencoba mengekstrak daftar Nilai Unik dari bidang menggunakan python

11

Saya memiliki sejumlah kolom dalam sejumlah tabel di dalam FGDB di mana saya perlu mengekstraksi nilai unik untuk setiap kolom.

Sebagai Contoh: nilainya mungkin [1,2,2,2,3,4], dan saya mencoba untuk mengembalikan [1,2,3,4]

Saya dapat melakukan pekerjaan ini dengan beberapa cara lain dalam ARCGIS tetapi saya mencoba untuk memperluas diri.

Saya telah menemukan sepotong python di web yang saya pikir akan melakukan pekerjaan itu tetapi saya berjuang untuk menjalankannya (saya terus mendapatkan kesalahan sintaks yang tidak valid karena saya terus mendapatkan kesalahan sintaks di baris 3) ini tidak diragukan lagi akan kesalahan pengguna yang sangat sederhana.

Cuplikan Kode di bawah ini

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})

Ini adalah Pesan Kesalahan yang saya dapatkan dari teks luhur:

 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]

Pembaruan dari Pertanyaan Asli

Saya sekarang telah memperbarui kode saya dengan jawaban yang diberikan di bawah ini tetapi saya menerima kesalahan sekunder.

Cuplikan Kode Baru:

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)

Saya mendapatkan pesan kesalahan baru yang terkait dengan kesalahan runtime

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'

[Selesai dalam 8.0s dengan kode keluar 1]

Saya berasumsi dari bacaan yang telah saya lakukan bahwa ini berkaitan dengan pengaturan env.workspace?

Hanya menunjukkan Bukti bahwa itu ada

Leith Hawkins
sumber
1
harap edit pertanyaan Anda untuk memasukkan seluruh pesan kesalahan Anda (sebagai teks)
Midavalo
Kesalahan baru Anda seharusnya tidak ada hubungannya dengan env.workspaceSaya tidak berpikir. Coba lepaskan rsebelum jalan, atau ubah \` to `di jalan (dan biarkan di rsana). Apakah Geodatabase itu ada?
Midavalo
Apakah Anda mencoba untuk mengisolasi semua nilai unik dalam bidang? Misalnya, Anda memiliki nilai berikut [1,2,2,2,3,4], apakah Anda mencoba untuk mengembalikan [1,2,3,4]. Harap perbarui pos untuk memasukkan informasi ini.
Aaron
@Midavalo maksud Anda mengubah jalur agar terlihat seperti ini? R'N: GISProjects _Landuse Plant_Biosecurity_Project ArcGIS_Online.gdb Holdings_Property_Merge ',' LU_ALUMMaj '
Leith Hawkins
1
Terima kasih - bukti segar bahwa saya tidak terlalu pintar tapi saya bisa mengangkat hal-hal yang berat. Aku berhutang budi padamu !!
Leith Hawkins

Jawaban:

14

Anda sudah cukup mengerti, Anda hanya perlu menentukan nama parameter Anda tabledan fielddalam definisi fungsi Anda, dan kemudian meneruskan nilai-nilai itu ketika Anda memanggil fungsi. Perhatikan lekukan Anda, karena ini penting untuk 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)

Pada dasarnya ini mengatakan bahwa ketika Anda memanggil fungsi unique_values()Anda akan memberikan nilai ke dua parameter, satu disebut table, yang lainnya disebut field. Ini kemudian digunakan dalam fungsi Anda. Ketika Anda memanggil fungsi, di telepon

myValues = unique_values(r'N:\GISProjects\Landuse\Plant_Biosecurity_Project\ArcGIS_Online.gdb\Holdings_Property_Merge' , 'LU_ALUMMaj')  

Anda meneruskan nilai ke parameter ini.

Ini sama dengan mendeklarasikan parameter Anda secara terpisah dan meneruskannya ke kursor secara langsung:

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
Midavalo
sumber
ahh itu masuk akal, ketika Anda memasukkan parameter individu di bawah ini saya mendapatkan apa yang Anda katakan terima kasih! . Saya tahu naik rantai kesalahan karena saya mendapatkan kesalahan waktu berjalan yang tidak memungkinkan saya untuk membuka database yang ada. Saya akan memperbarui pertanyaan saya.
Leith Hawkins
Mengapa baris yang diurutkan () mengembalikan hanya satu contoh unik dari setiap nilai ketika fungsi yang diurutkan () mengembalikan duplikat jika Anda menjalankannya pada daftar sederhana seperti ['a', 'b', 'a', 'b']? Saya telah menggunakan balasan ini untuk beberapa waktu dan menyadari bahwa saya tidak mengerti mengapa ia bekerja.
Dylan Warburg
2
@DylanWarburg Karena Anda tidak melewati daftar nilai, Anda melewati satu set . Jika Anda menambahkan item daftar Anda di atas ke set, misalnya set(['a', 'b', 'a', 'b']), itu akan mengembalikan nilai unik {'a', 'b'}. Menggunakan sorted()hanya mengembalikannya dalam urutan yang diurutkan karena set sederhana tidak disortir.
Midavalo
Jika bidang yang Anda cari nilai uniknya bukan string, Anda harus menambahkan: return diurutkan ({str (baris [0]) untuk baris dalam kursor})
MKelly
8

Saya akan menyarankan menggunakan set()fungsi built-in Python bersama dengan SearchCursorsebagai ekspresi generator untuk menemukan nilai-nilai unik. Anda akan menemukan pendekatan ini sangat efisien dengan kumpulan data besar atau kecil:

import arcpy

fc = r'C:\path\to\your.gdb\featureclass'

unique_values = set(row[0] for row in arcpy.da.SearchCursor(fc, "some_field"))
Harun
sumber
1
Ini pada dasarnya adalah apa yang dilakukan jawaban @ Midavalo serta tanda kurung {} digunakan untuk mendefinisikan objek yang ditetapkan .
user2856
1
Saya mempertimbangkan menyarankan hal yang sama persis. Jika yang Anda inginkan adalah daftar, Anda selalu dapat mengubah set kembali menjadi daftar dengan daftar python asli () fx.
jbchurchill
3

Pendekatan berikut diterbitkan di https://arcpy.wordpress.com/2012/02/01/create-a-list-of-unique-field-values/ Menggunakan busur dan numpy dan memiliki jejak memori yang lebih kecil daripada Pendekatan 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
sumber
0

Saya tahu ini pertanyaan lama, tetapi saya akan meninggalkan ini di sini untuk siapa saja yang menemukan ini mencari bantuan. Menggunakan arcpy.Frequency_analysis()dengan cepat menempatkan semua nilai unik dari bidang ke tabel baru, yang kemudian dapat Anda gunakan untuk operasi kursor. Satu perintah tunggal untuk melakukan apa yang semua solusi lain lakukan dan lebih cepat dan lebih mudah. Sebagai bonus, Anda juga mendapatkan hitungan berapa kali setiap nilai muncul.

Colin Lang
sumber