Tìm bản ghi trùng lặp trong trường bằng ArcGIS cho Máy tính để bàn?


9

Tôi đang tìm các bản ghi trùng lặp trong các tệp dbf dựa trên thuộc tính được gọi là 'ID'. Tôi có các tệp dbf khác nhau từ 500.000 bản ghi đến 1,5 triệu và tôi biết có một loạt các bản sao.

Tôi muốn thêm một trường 'Sao y' có nghĩa là Có hoặc Không (hoặc 1 hoặc 0 là tốt) khi thuộc tính ID có mặt ở nơi khác. Sử dụng tập lệnh python sau đây trong Máy tính trường trả về 1 cho mục nhập trùng lặp và 0 cho mục nhập duy nhất;

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

Tuy nhiên, bản ghi đầu tiên của, ví dụ, 5 ID trùng lặp cũng sẽ được trả về là 0 (4 bản tiếp theo được coi là bản sao). Tôi sẽ cần tất cả 5 để được đánh dấu là trùng lặp vì ID tồn tại ở nơi khác.

Sử dụng mã sau đây sẽ cung cấp cho bạn tổng số lần tăng của số lần ID đó xảy ra với 1 lần nghĩa là lần đầu tiên và vv;

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

isDuplicateIndex( !YOUR_FIELD! )

Tôi chỉ muốn 1 (hoặc Có) nếu ID của hồ sơ đó tồn tại ở nơi khác! (Phiên bản ArcGIS 10.1)

Tôi đã thấy các câu trả lời khác như tập lệnh Python để xác định các bản ghi trùng lặp (theo dõi) nhưng nó không hoạt động.

Câu trả lời:


11

Một giải pháp thay thế là sử dụng công cụ " thống kê tóm tắt " hiện có trong ArcGIS, sau đó bạn tham gia bảng kết quả dựa trên trường ID của bạn. Các bản sao sẽ có "COUNT" lớn hơn 1, do đó, thật đơn giản để tính toán nó với máy tính trường của bạn.


Làm thế nào để phương pháp của bạn đạt được việc gán bản ghi trùng lặp đầu tiên được tìm thấy là '0'?
nghệ thuật21

@ radouxju Cảm ơn câu trả lời của bạn, tôi có thể thấy số lượng đa giác được nhân đôi bằng cách chọn theo thuộc tính ngay bây giờ. Ngạc nhiên vì điều này đã không xảy ra với tôi khi tất cả những thứ trăn đã làm!
Sam

@ tác phẩm nghệ thuật21 tôi không muốn bản sao thứ 1 là 0, tôi muốn bất kỳ bản sao nào có bản sao là 'CÓ', hoặc bây giờ - vì nó là - một số lớn hơn 1
Sam

@Sam, bạn đang đề cập đến điều gì với tuyên bố này, "tuy nhiên bản ghi đầu tiên của, ví dụ, 5 ID trùng lặp cũng sẽ được trả về là 0;"?
nghệ thuật21

@ tác phẩm nghệ thuật21. Xin lỗi, tôi nghĩ rằng từ ngữ ban đầu của tôi không rõ ràng, tôi sẽ sửa đổi. Điều tôi đã cố gắng nói là nếu tất cả 5 bản ghi đều có cùng một ID, đoạn mã python đó sẽ xác định trường hợp thứ nhất là một ID duy nhất và 4 bản tiếp theo là các bản sao. Tôi muốn tất cả 5 được đánh dấu là trùng lặp (ví dụ: ID đó tồn tại ở nơi khác)
Sam

1

Một giải pháp thay thế khác ( chỉ hoạt động với môi trường SDE ) là sử dụng chức năng SQL hiện có trong ArcGIS để hiển thị các bản ghi trùng lặp

Nhận bản ghi trùng lặp trong bảng (Chọn theo thuộc tính)

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

Thí dụ:

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

Bạn có thể làm điều này để làm việc trong một cơ sở dữ liệu địa lý tập tin? Truy vấn hoạt động thành công trong cơ sở dữ liệu địa lý cá nhân, nhưng khi tôi thử chạy nó trong cơ sở dữ liệu địa lý tệp thì không thành công với thông báo "Một câu lệnh SQL không hợp lệ đã được sử dụng." Chỉnh sửa: theo liên kết tài liệu , chỉ các truy vấn con giới hạn được hỗ trợ trong cơ sở dữ liệu địa lý tệp.
isburns 30/03/2016

Truy vấn được sao chép trực tiếp từ bài đăng của bạn và tham chiếu đúng tên bảng và trường. Các truy vấn là hợp lệ khi tôi loại bỏ HAVING COUNT(*) > 1. Tôi thực sự không thấy cách nào để nó hoạt động trong cơ sở dữ liệu địa lý tệp . Tôi biết bài viết công nghệ này có phần lỗi thời, nhưng dường như đó là nguồn của câu lệnh SQL của bạn và nó chỉ ra rằng nó không hoạt động trong cơ sở dữ liệu địa lý tệp. Tôi sẵn sàng nâng cao câu trả lời của bạn nếu tôi có thể làm cho nó hoạt động trong tệp gdbs hoặc thêm vào để làm rõ chúng là ngoại lệ.
isburns 30/03/2016

@isburns Tôi đã nhầm, làm việc trong môi trường SDE và không nộp cơ sở dữ liệu địa lý. Một điều bạn có thể làm như một cách giải quyết là đưa dữ liệu bảng vào Excel tìm các bản sao và sau đó tham gia danh sách các bản sao trong ArcGIS, sau đó sẽ chỉ hiển thị các bản ghi đó, không lý tưởng nhưng hoạt động.
Tristan Chuyển tiếp

1
Cảm ơn các cập nhật. Tôi nêu lên câu trả lời của bạn vì nó hoạt động và khá đơn giản và nhanh chóng trong cơ sở dữ liệu địa lý được hỗ trợ. Tôi biết bây giờ trong các bình luận, nhưng bạn cũng có thể muốn chỉnh sửa bài đăng để chỉ ra rằng nó hoạt động trong cơ sở dữ liệu địa lý cá nhân và SDE nhưng không phải tệp cơ sở dữ liệu địa lý hoặc shapefiles.
isburns

0

Kịch bản sau đây tạo một trường mới với số lần xuất hiện của mỗi giá trị từ một trường được chỉ định. Vì vậy, đối với ex, nếu bạn có "Paris" 6 lần trong lĩnh vực đó, mỗi hàng với "Paris" sẽ nhận được 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.")

Nó có thể dễ dàng sửa đổi để bạn có thể có "Có" hoặc 1 nếu đếm> 1, nhưng tôi đoán rằng việc có số đếm thực tế sẽ hữu ích hơn.

Chỉnh sửa sau: Hoặc bạn có thể sử dụng điều này trong máy tính trường. Mã kịch bản tiền logic:

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

trường trùng lặp =

duplicates(!sample_field!)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.