Як знайти дублікати записів у полі за допомогою ArcGIS for Desktop?


9

Я шукаю дублікати записів у dbf-файлах на основі атрибута під назвою 'ID'. У мене є різні dbf файли від 500 000 записів до 1,5 мільйона, і я знаю, що існує безліч дублікатів.

Я хотів би додати поле "Дублікат", яке говорить Так чи Ні (або 1 або 0 добре), коли атрибут ID присутній в іншому місці. Використовуючи наступний скрипт python у Field Calculator повертає 1 для дублюючого запису та 0 для унікального запису;

uniqueList = []
def isDuplicate(inValue):
  if inValue in uniqueList:
    return 1
  else:
    uniqueList.append(inValue)
    return 0
isDuplicate(!FIELD_NAME!)

Однак 1-й запис, наприклад, 5 дублікатів ідентифікаторів, також буде повернутий як 0 (наступні 4 вважаються дублікатами). Мені потрібно, щоб усі 5 були позначені як дублікати, оскільки ідентифікатор існує в інших місцях.

Використання наведеного нижче коду дасть вам додатковий підрахунок, скільки разів ця ідентифікація виникає, а 1 означає перший випадок тощо;

UniqueDict = {}
def isDuplicateIndex(inValue):
    UniqueDict.setdefault(inValue,0)
    UniqueDict[inValue] += 1
    return UniqueDict[inValue]

isDuplicateIndex( !YOUR_FIELD! )

Я просто хочу 1 (або Так), якщо ідентифікатор цього запису існує в іншому місці! (Версія ArcGIS 10.1)

Я бачив інші відповіді, такі як сценарій Python для виявлення дублікатів записів (подальша робота), але це не зовсім працює.

Відповіді:


11

Альтернативним рішенням є використання існуючого інструменту " зведеної статистики " в ArcGIS, після чого ви приєднуєтесь до отриманої таблиці на основі поля вашого ідентифікатора. У дублікатів буде "COUNT" більший, ніж 1, тому його легко обчислити за допомогою калькулятора поля.


Як ваш метод дозволяє призначити перший повторний запис, знайдений як "0"?
художній твір21

@ radouxju Дякую за вашу відповідь, я можу побачити, яка кількість багатокутників є дублікатами, просто вибравши за атрибутом зараз. Здивований, це не сталося зі мною, коли всі речі з пітона зробили!
Сем

@ Artwork21 я не хочу, щоб перший дублікат бути 0, я хотів що - небудь , що було дублікат , щоб бути «ТАК», або зараз - як це - число більше 1
Сем

@Sam, що ви маєте на увазі з цим твердженням, "проте 1-й запис, наприклад, 5-ти дублікатів ідентифікаторів, також буде повернутий як 0;"
художній твір21

@ artwork21. Вибачте, я вважаю, що моє первісне формулювання було не дуже зрозумілим, я буду виправляти зміни. Що я намагався сказати, що якщо 5 записів мали однаковий ідентифікатор, цей фрагмент коду python ідентифікував 1-й екземпляр як унікальний ідентифікатор, а наступні 4 - як дублікати. Я хотів, щоб усі 5 були позначені як копії (тобто, що посвідчення особи існували в іншому місці)
Сем

1

Іншим альтернативним рішенням ( працює лише з середовищами SDE ) є використання існуючої функціональності SQL в ArcGIS для показу повторюваних записів

Отримати копії записів у таблиці (Вибрати за атрибутом)

[FIELD_NAME] In (SELECT [FIELD_NAME] FROM [TABLE_NAME] GROUP BY [FIELD_NAME] HAVING Count(*)>1 )

Приклад:

ID In (SELECT ID FROM GISDATA.MY_TABLE GROUP BY ID HAVING Count(*)>1 )

Чи можете ви змусити це працювати в базі даних геоданих? Запит успішно працює в особистому базі геоданих, але коли я намагаюся запустити його у файлі geodatabase, він не вдається з повідомленням "Неправильний оператор SQL був використаний". Редагувати: згідно з посиланням на документацію , у файлових базах даних підтримуються лише обмежені підзапити.
isburns

Запит скопіюється безпосередньо з вашої публікації та посилається на правильні назви таблиці та полів. Запит дійсний, коли я видаляю HAVING COUNT(*) > 1. Я дійсно не бачу способу змусити його працювати у файлових базах даних. Я знаю, що ця стаття дещо датована, але вона, здається, є джерелом вашої заяви SQL, і вона вказує на те, що вона не працює у базі даних про геодані. Я готовий подати вашу відповідь, якщо я можу змусити її працювати у файлі gdbs, або додано уточнення, щоб вказати, що вони є винятком.
isburns

@isburns Я помилився, працює в середовищі SDE і не зберігає геодані. Одне, що ви можете зробити як вирішення, - це ввести дані таблиці в Excel, знайти дублікати, а потім приєднатись до списку оперізуючих аркушів в ArcGIS, який би потім показував лише ті записи, не ідеальні, але працюють.
Трістан Вперед

1
Дякуємо за оновлення. Я підтримав вашу відповідь, тому що вона працює і є досить простою і швидкою в підтримуваних базах даних. Я знаю, що це зараз у коментарях, але ви, можливо, захочете також відредагувати саму публікацію, щоб вказати, що вона працює в персональних базах даних та геодезичних даних SDE, але не має файлів баз геоданих чи форм.
isburns

0

Наступний скрипт створює нове поле з кількістю входів кожного значення із заданого поля. Так, наприклад, якщо у вас є "Париж" 6 разів у цьому полі, кожен рядок із "Парижем" отримає 6.

import arcpy

arcpy.env.workspace=r"D:\test.gdb"
infeature="sample_feature"
field_in="sample_field"
field_out="COUNT_"+field_in

#create the field for the count values
arcpy.AddField_management(infeature,field_out,"SHORT")

#creating the list with all the values in the field, including duplicates
lista=[]
cursor1=arcpy.SearchCursor(infeature)
for row in cursor1:
    i=row.getValue(field_in)    
    lista.append(i)
del cursor1, row

#updating the count field with the number on occurrences of field_in values
#in the previously created list
cursor2=arcpy.UpdateCursor(infeature)
for row in cursor2:
    i=row.getValue(field_in)
    occ=lista.count(i)   
    row.setValue(field_out,occ)
    cursor2.updateRow(row)
del cursor2, row
print ("Done.")

Його можна легко змінити, щоб ви могли мати "Так" або 1, якщо рахувати> 1, але я думаю, що мати фактичне число підрахунку є кориснішим.

Пізніше Редагувати: Або ви можете використовувати це в польовому калькуляторі. Код сценарію до логіки:

infeature="sample_feature" #change with the name of your feature
lista=[]
field="sample_field" #change with your field with duplicates
cursor1=arcpy.SearchCursor(infeature)
for row in cursor1:
    i=row.getValue(field)    
    lista.append(i)
del cursor1, row

def duplicates(field_in):        
    occ=lista.count(field_in)
    return occ

дублікат поля =

duplicates(!sample_field!)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.