Pythonを使用してフィールドから一意の値のリストを抽出しようとしています


11

各列の一意の値を抽出する必要があるFGDB内のいくつかのテーブルにいくつかの列があります。

例:値は[1,2,2,2,3,4]で、[1,2,3,4]を返そうとしています

私はARCGISで他の多くの方法でこの仕事をすることができましたが、自分自身を拡張しようとしています。

私は仕事をすると思うPythonの断片をウェブ上で見つけましたが、それを実行させるのに苦労しています(3行目に構文エラーが出続けるので、無効な構文エラーが出続けます)これは間違いないでしょう本当にシンプルなユーザーエラー。

以下のコードスニペット

import arcpy

def unique_values(r'N:\GISProjects\Landuse\Plant_Biosecurity_Project\ArcGIS_Online.gdb\Holdings_Property_Merge' , 'LU_ALUMMaj'):
with arcpy.da.SearchCursor(table, [field]) as cursor:
    return sorted({row[0] for row in cursor})

これは私が崇高なテキストから受け取るエラーメッセージです:

 File "C:\Users\hawkinle\Desktop\STDTAS\Unique_Data.py", line 3
def unique_values(r'N:\GISProjects\Steve_Eastwood_Landuse\Plant_Biosecurity_Project\ArcGIS_Online.gdb\Holdings_Property_Merge' , 'LU_ALUMMaj'):
                                                                                                                             ^
SyntaxError: invalid syntax
[Finished in 0.1s with exit code 1]

元の質問からの更新

これで、以下の回答でコードを更新しましたが、二次的なエラーが発生しています。

新しいコードスニペット:

import arcpy

def unique_values(table , field):
    with arcpy.da.SearchCursor(table, [field]) as cursor:
        return sorted({row[0] for row in cursor})

myValues = unique_values(r'N:\\GISProjects\\Landuse\\Plant_Biosecurity_Project\\ArcGIS_Online.gdb\\Holdings_Property_Merge' , 'LU_ALUMMaj')

print (myValues)

ランタイムエラーに関連する新しいエラーメッセージが表示される

Traceback (most recent call last):
File "C:\Users\hawkinle\Desktop\STDTAS\Unique_Data.py", line 7, in <module>
myValues = unique_values(r'N:\\GISProjects\\Steve_Eastwood_Landuse \Plant_Biosecurity_Project\\ArcGIS_Online.gdb\\Holdings_Property_Merge' , 'LU_ALUMMaj')
 File "C:\Users\hawkinle\Desktop\STDTAS\Unique_Data.py", line 4, in unique_values
with arcpy.da.SearchCursor(table, [field]) as cursor:
RuntimeError: cannot open 'N:\\GISProjects\\Steve_Eastwood_Landuse\\Plant_Biosecurity_Project\\ArcGIS_Online.gdb\\Holdings_Property_Merge'

[8.0sで終了コード1で終了]

私が読んだことから、これはenv.workspaceの設定に関連していると思いますか?

存在することを証明するだけ


1
エラーメッセージ全体を(テキストとして)含めるように質問を編集してください
ミダバロ

新しいエラーは、env.workspace私が考えていないこととは関係ありません。rパスの前を削除するか、パスの\` to `を変更してみてください(そしてrそこに残します)。そのジオデータベースは存在しますか?
ミダバロ

フィールド内のすべての一意の値を分離しようとしていますか?たとえば、次の値[1,2,2,2,3,4]があるとしましょう[1,2,3,4]。この情報が含まれるように投稿を更新してください。
アーロン

GISProjects _Landuse Plant_Biosecurity_Project ArcGIS_Online.gdb Holdings_Property_Merge」、 'LU_ALUMMaj':?あなたはこのようなパスtolook R'N変更@Midavaloを意味しなかった
リース・ホーキンス

1
ありがとう-あまり賢くはないが、重いものを持ち上げることができるというさらなる証拠。私はあなたにスパイトを借りています!!
リースホーキンス

回答:


14

あなたはかなりそれを持って、あなたは自分のパラメータの名前を指定する必要がありますtableし、fieldあなたの関数定義では、その後、あなたが関数を呼び出す際に、それらの値を渡します。Pythonには不可欠なので、インデントにも注意してください。

def unique_values(table , field):
    with arcpy.da.SearchCursor(table, [field]) as cursor:
        return sorted({row[0] for row in cursor})

myValues = unique_values(r'N:\GISProjects\Landuse\Plant_Biosecurity_Project\ArcGIS_Online.gdb\Holdings_Property_Merge' , 'LU_ALUMMaj')

print (myValues)

基本的に、これは、関数を呼び出すときにunique_values()、2つのパラメーターに値を渡すことを示しています。1つはを呼び出しtable、もう1つはを呼び出しfieldます。これらは、関数で使用されます。関数を呼び出すと、次の行で

myValues = unique_values(r'N:\GISProjects\Landuse\Plant_Biosecurity_Project\ArcGIS_Online.gdb\Holdings_Property_Merge' , 'LU_ALUMMaj')  

これらのパラメーターに値を渡します。

これは、パラメーターを個別に宣言し、それらを直接カーソルに渡すことと同じです。

table = r'N:\GISProjects\Landuse\Plant_Biosecurity_Project\ArcGIS_Online.gdb\Holdings_Property_Merge'
field = 'LU_ALUMMaj'

with arcpy.da.SearchCursor(table, [field]) as cursor:
    myValues = sorted({row[0] for row in cursor})

print myValues

ああ、それは理にかなっています、以下の個々のパラメーターを含めると、私はあなたが言っていることを感謝します!。既存のデータベースを開くことができないランタイムエラーが発生しているので、エラーのチェーンを上に移動することを知っています。質問を更新します。
リースホーキンス

Sorted()関数が['a'、 'b'、 'a'、 'b']のような単純なリストで実行すると、sorted()関数が重複を返すときに、各値の一意のインスタンスを1つだけ返すのはなぜですか?私はしばらくの間この返信を使用しており、なぜそれが機能するのか理解していないことに気付きました。
ディランウォーバーグ

2
@DylanWarburg 値のリストを渡していないので、セットを渡しています。上記のリスト項目をセットなどに追加すると、set(['a', 'b', 'a', 'b'])一意の値が返されます{'a', 'b'}sorted()単純なセットは並べ替えられていないため、を使用すると、並べ替えられた順序で返されます。
ミダバロ

もしから一意の値を探しているフィールドが文字列でない場合、追加すべきである:復帰({カーソルの行のためのSTR(行[0])})ソート
MKelly

8

一意の値を見つけるために、Pythonの組み込みset()関数をジェネレータ式SearchCursorとして使用することをお勧めします。この方法は、大規模または小規模のデータセットで非常に効率的です。

import arcpy

fc = r'C:\path\to\your.gdb\featureclass'

unique_values = set(row[0] for row in arcpy.da.SearchCursor(fc, "some_field"))

1
これは基本的に@Midavaloの答えが行うことであり、{}括弧はセットオブジェクトを定義するために使用されます
user2856

1
私はまったく同じことを提案することを考えました。必要なものがリストである場合は、常にネイティブのpython list()fxを使用してセットをリストに戻すことができます。
jbchurchill 2016

3

次のアプローチはhttps://arcpy.wordpress.com/2012/02/01/create-a-list-of-unique-field-values/で公開されています。arcpyとnumpyを使用しており、メモリフットプリントがSearchCursorアプローチ。

import arcpy
import numpy

def unique_values(table , field):
    data = arcpy.da.TableToNumPyArray(table, [field])
    return numpy.unique(data[field]).tolist()

myValues = unique_values(r'N:\GISProjects\Landuse\Plant_Biosecurity_Project\ArcGIS_Online.gdb\Holdings_Property_Merge' , 'LU_ALUMMaj')

print (myValues)

0

私はそれが古い質問であることを知っていますが、助けを求めてこれに遭遇した人のためにここに残しておきます。を使用arcpy.Frequency_analysis()すると、フィールドのすべての一意の値が新しいテーブルに入れられ、カーソル操作に使用できます。これらすべての他のソリューションが行うことを実行するための単一のコマンドで、より速く、より簡単です。おまけとして、各値の出現回数もカウントされます。

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