Daha çox

Bir xüsusiyyət sinifində təkrarlanan dəyərləri tapmaq və bir sahəni doldurmaq üçün Python istifadə edin

Bir xüsusiyyət sinifində təkrarlanan dəyərləri tapmaq və bir sahəni doldurmaq üçün Python istifadə edin


Bu python skriptini burada başqa bir yazıda tapdım və ehtiyaclarım üçün düzəltməyə çalışırdım. Mən çox təcrübəsiz bir python istifadəçisiyəm, buna görə də skriptin necə dəyişdiriləcəyi ilə mübarizə aparıram. Dublikat dəyərləri üçün bir sahədə axtarış aparmaq və dublikat üçün Y və ya heç biri üçün N ilə yeni bir sahə doldurmaq istədiyim bir xüsusiyyət Dataset -də saxlanılan Xüsusiyyət Sinifim var. Aşağıdakı skript, tapdığım sənəd faylı məlumat bazasına daxil olmaq üçün bir yol tapdıqdan sonra işləyəcək kimi görünür.

arcpy import * inShapefile = pointsShapefile checkField = "xyCombine" updateField = "dplicate" #Bir dəfə tapılan dəyərlərin siyahısıOnce = [] #iki dəfə tapılan dəyərlərin siyahısıTwice = [] cursor = da.SearchCursor (inShapefile, [checkField]) üçün imlecdəki satır: #Satır [0] olarsa #yoxlama dəyəri sıfır deyil: #Əgər iki dəfə baş vermirsə, [0] sətrində iki dəfə baş vermirsə davam edin: meydana gəlir Bir dəfə: #Əlavə et siyahı bir dəfə baş verdikdə baş verir.Once.append (satır [0]) #Əgər dəyər başqa bir dəfə tapılıbsa: #Əlavə et iki dəfə baş verir siyahı (dublikatlar) meydana gəlirTwice.append (sıra [0]) del kursor imleci = da .UpdateCursor (inShapefile, [checkField, updateField]) imlecdəki satır üçün: #Check dəyəri sıfır deyilsə sıra [0]: #check in value baş verərsə İki dəfə siyahıda (yəni dublikat) satırda [0] baş verərsəTwice: row [ 1] = "Y" başqa: satır [1] = "N" cursor.updateRow (satır) del kursor

Belə bir şey işləməlidir:

arcpy inShapefile = pointsShapefile checkField = arcpy.da.SearchCursor (inShapefile, [checkField]) ilə arcpy inShapefile = pointsShapefile checkField = "xyCombine" updateField: dəyərlər = [r [0] r sıralarında] d = {} maddə daxilində set (dəyərlər): if values.count (item)> 1: d [item] = 'Y' başqa: d [item] = 'N' arcpy.da.UpdateCursor ilə (inShapefile, [checkField, updateField]) satır kimi : satır sıraları üçün: əgər satır [0] d: satır [1] = d [satır [0]] rows.updateRow (satır)

Və @mr.adamın təklif etdiyi kimi lüğətə ehtiyac yoxdur. burada daha təmiz versiya:

arcpy def findDupes (inShapefile, checkField, updateField): arcpy.da.SearchCursor ilə (inShapefile, [checkField]) satır kimi daxil edin: arcpy.da.UpdateCursor ilə (dəyərlər = [r [0] satır sıralarında]] checkField, updateField]) satır kimi: satırdakı satır üçün: if values.count (row [0])> 1: row [1] = 'Y' else: row [1] = 'N' rows.updateRow (row) əgər __name__ == '__main__': fc = r'C:  TEMP  crm_test.gdb  test 'fld =' Project_Manager 'up =' dublikatlar 'findDupes (fc, fld, up)

Qabaqcıl və ya Məlumat lisenziyanız varsa, Arc -da başqa bir seçim eyni tapmaq vasitəsini istifadə etməkdir. Bu, sizə uyğun dəyərləri olan ID satır cədvəli verəcəkdir. ONLY_DUPLICATES seçimindən istifadə edin. Sonra birləşmə növü üçün KEEP_COMMON açar sözünü istifadə edərək cədvəli xüsusiyyət sinifinə (fc ObjectID -dən InFID -ə) qoşun (bu xüsusiyyət sinifiniz yalnız uyğun qeydləri göstərəcək). təbəqə üzərində hesablama. Nəhayət, qalan xüsusiyyətləri əldə etmək üçün birləşməni çıxarın.

Səmərəliliyin da kursoru ilə necə müqayisə edildiyini bilmirəm. Sadəcə başqa bir seçim.


Dublikatları tapmaq və sayını yeni bir sahəyə əlavə etmək üçün daha yeni bir həll təqdim edirəm. ESRI -nin kömək sənədindən düzdür: ArcGIS Pro -da təkrarlanan və ya bənzərsiz dəyərləri necə müəyyən etmək olar.

import arcpy "Bu skript bir sahədə bir dəyərin meydana gəlmələrinin sayını (" field_in ") sayacaq və onları yeni bir sahəyə (" field_out ") yazacaq" arcpy.env.workspace = r "C:  Users  DuplicateTesting. gdb " #GDB -yə gedən yol bura gedir infeature =" backup_02232021 " #xüsusiyyət sinifinin adı bura gedir field_in =" location_string_output " #sütunda field_out =" COUNT _ "+sahəsində_yayda arcpy.AddField_management (infeature, field_out, "QISA") lista = [] cursor1 = arcpy.SearchCursor (infeature) in cursor1 in cursor1: i = row.getValue (field_in) lista.append (i) del cursor1, row cursor2 = arcpy.UpdateCursor (infeature) in the row cursor2: i = row.getValue (field_in) occ = lista.count (i) row.setValue (field_out, occ) cursor2.updateRow (row) del cursor2, satır çapı ("---- tamamlandı ----")

Videoya baxın: البحث بشرطين أو أكثر مع معالجة القيم المتكررة