使用ArcGIS for Desktop在字段中查找重复记录?


9

我正在基于称为“ ID”的属性在dbf文件中寻找重复记录。我有各种dbf文件,从500,000条记录到150万条记录,我知道有很多重复项。

我想添加一个ID为“是”或“否”(或1或0很好)的字段“ Duplicate”,当ID属性存在于其他位置时。在字段计算器中使用以下python脚本,对于重复项返回1,对于唯一项返回0;

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

但是,第一个记录(例如5个重复ID)也将返回为0(随后的4个被视为重复)。我需要将所有5个标记为重复,因为该ID在其他位置存在。

使用以下代码将为您提供ID出现次数的递增计数,其中1表示第一次出现,以此类推;

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

isDuplicateIndex( !YOUR_FIELD! )

如果该记录的ID在其他地方存在,我只想要1(或是)!(ArcGIS版本10.1)

我看到了其他答案,例如用于识别重复记录的Python脚本(跟进),但效果不佳。

Answers:


11

另一种解决方案是使用ArcGIS中现有的“ 摘要统计信息 ”工具,然后根据您的ID字段加入结果表。重复项的“ COUNT”大于1,因此使用您的字段计算器进行计算很简单。


您的方法如何实现将找到的第一个重复记录分配为“ 0”?
艺术品

@ radouxju感谢您的回答,我现在只需按属性选择就可以看到重复的多边形数量。当所有的python东西都发生时,我没有想到这没有!
2014年

@ artwork21我不想第一次重复是一个0,我想:只要有一个重复的是一个“YES”,还是现在-因为它是-一个大于1
山姆

@Sam,此语句对您意味着什么,“例如,第一个记录(例如5个重复ID)也将返回为0;”?
艺术品

@ artwork21。不好意思,我想我的原始措词不太清楚,我会修改。我要说的是,如果5条记录都具有相同的ID,那条python代码会将第一个实例标识为唯一ID,随后的4个标识为重复ID。我希望将所有5个都标记为重复(即该ID存在于其他位置)
2014年

1

另一个替代解决方案(仅适用于SDE环境)是使用ArcGIS中的现有SQL功能来显示重复记录

获取表中的重复记录(按属性选择)

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

您可以在文件地理数据库中使用它吗?该查询在个人地理数据库中成功运行,但是当我尝试在文件地理数据库中运行该查询时,失败,并显示消息“使用了无效的SQL语句”。编辑:根据文档链接,文件地理数据库仅支持有限的子查询。
isburns's

该查询直接从您的帖子中复制,并引用正确的表和字段名称。当我删除时查询有效HAVING COUNT(*) > 1。我真的没有找到在文件地理数据库中使用它的方法。我知道这篇技术文章有些过时,但它似乎是您的SQL语句的来源,它表明它不适用于文件地理数据库。如果可以在gdbs文件中使用它,或者可以添加说明以指明它们是例外,我准备对您的答案进行投票。
isburns

@isburns我错了,它可以在SDE环境中工作,而不是文件地理数据库。作为解决方法,您可以做的一件事是将表数据带入Excel中,找到重复项,然后在ArcGIS中将重复项列表重新加入,这将仅显示那些记录,但不理想,但可以使用。
Tristan Forward

1
感谢更新。我赞成您的回答,因为它确实有效,并且在受支持的地理数据库中非常简单快捷。我知道它现在在注释中,但是您可能还希望编辑该帖子本身,以表明它可以在个人和SDE地理数据库中使用,但不适用于文件地理数据库或shapefile。
isburns's

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!)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.