ArcGIS for Desktopを使用してフィールドで重複レコードを検索しますか?


9

「ID」と呼ばれる属性に基づいて、dbfファイル内の重複レコードを探しています。50万レコードから150万レコードまでのさまざまなdbfファイルがあり、多数の重複があることを知っています。

ID属性が他の場所にある場合に、「はい」または「いいえ」(または1または0で十分)と表示されるフィールド「重複」を追加したいと思います。Field Calculatorで次の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つは重複と見なされます)。IDが他の場所に存在するため、5つすべてを重複としてマークする必要があります。

次のコードを使用すると、そのIDが何回発生したかを増分カウントできます。1は1回目を意味し、以下同様です。

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

isDuplicateIndex( !YOUR_FIELD! )

そのレコードのIDが他の場所に存在する場合は、1(または[はい])が必要です。(ArcGISバージョン10.1)

重複レコードを特定するためのPythonスクリプト(フォローアップ)などの他の回答を見てきましたが、うまくいきません。

回答:


11

別の解決策は、ArcGIS の既存の「サマリー統計」ツールを使用して、IDフィールドに基づいて結果のテーブルを結合することです。重複には「COUNT」が1より大きいので、フィールド計算機で簡単に計算できます。


あなたの方法はどのようにして「0」として見つかった最初の重複レコードを割り当てるのですか?
アートワーク21

@ radouxjuご回答ありがとうございます。属性で選択するだけで、どのくらいの量のポリゴンが複製されているかを確認できます。すべてのpythonがそうであったときに、これは私には起こりませんでした!
Sam

そのまま- - 1より数の大きい@ artwork21私は第一の重複が0になりたいdidntの、私は「YES」であることが重複していた何かを望んでいた、または今
サム・

@Sam、このステートメントで何を参照していますか。「たとえば、5つの重複するIDの最初のレコードも0として返されます。」
アートワーク21

@ artwork21。申し訳ありませんが、元の文言はあまり明確ではなかったと思います。修正します。私が言おうとしていたのは、5つのレコードすべてに同じIDが含まれている場合、そのPythonコードは最初のインスタンスを一意のIDとして識別し、その後の4つは重複していると識別することです。5つすべてを重複としてマークしたい(つまり、そのIDは他の場所に存在していた)
Sam

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 2016年

クエリは投稿から直接コピーされ、正しいテーブル名とフィールド名を参照します。を削除しても、クエリは有効ですHAVING COUNT(*) > 1ファイルジオデータベースで機能させる方法が本当にわかりません。この技術記事は多少古くなっていますが、これはSQLステートメントのソースのようであり、ファイルジオデータベースでは機能しないことを示しています。ファイルgdbで機能させることができる場合、またはそれらが例外であることを示すために説明が追加されている場合は、回答を賛成する準備ができています。
isburns 2016年

@isburns私は誤っており、ファイルジオデータベースではなくSDE環境で機能します。回避策として実行できることの1つは、テーブルデータをExcelに取り込み、重複を見つけて、Dupesのリストを結合してArcGISに戻すと、それらのレコードのみを表示し、理想的ではなく機能します。
Tristan Forward

1
更新していただきありがとうございます。サポートされているジオデータベースでは機能し、かなりシンプルで高速であるため、私はあなたの回答を賛成しました。私はそれがコメントにあることを知っていますが、投稿自体を編集して、個人およびSDEジオデータベースでは機能するが、ファイルジオデータベースやシェープファイルでは機能しないことを示すこともできます。
isburns 2016年

0

次のスクリプトは、指定されたフィールドからの各値の出現回数で新しいフィールドを作成します。したがって、たとえば、そのフィールドに「Paris」が6回ある場合、「Paris」のある各行は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.")

「Yes」またはcount> 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!)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.