テーブルのゼロ値を行で数え、新しいフィールドに書き込む方法は?


9

これは非常に簡単な作業ですが、正しい構文を理解できません。

次のような属性を持つシェープファイルがあります。

FID Shape   FIELD1 FIELD2 FIELD3 ...
0   Polygon 0      1      0
1   Polygon 3      0      7
2   Polygon 3      4      7
...

フィールドの数とその名前は常に異なります。

新しいフィールドを作成し(NUMという名前にします)、各行のゼロの数を数える必要があります。

出力例:

FID Shape   FIELD1 FIELD2 FIELD3 NUM
0   Polygon 0      1      0      2
1   Polygon 3      0      7      1
2   Polygon 3      4      7      0

私は新しいフィールドを作成する方法を知っていますが、次のステップは明確ではありません。


作業コード:

#path is path to shape file
def a(path):
  fields = arcpy.ListFields(path,"FID_*") #FID_* is wildcard to select a fields name 
  arcpy.AddField_management(path, "NUM", "SHORT") #create a field with name NUM
  cursor= arcpy.UpdateCursor(path) 
  for row in cursor:
    count=0
    for field in fields: 
      a= row.getValue(field.name) #take a value 
      if a==0: #if value=0 then value=value+1
        count+=1
    row.setValue("NUM", count)
    cursor.updateRow(row)
  del row 
  del cursor

blah238のおかげで、今ではニシキヘビを食べることができます!

回答:


8

これを行う1つの方法の概要を次に示します。演習としてコーディングをお任せします。

  1. 入力など、必要なパラメーターを読み取ります。 table
  2. fieldsを使用して変数を作成しますListFields()。必要に応じてfield_type、たとえばLongを渡します
  3. 新しいフィールド " NUM" tableを使用に追加しますAddField()
  4. cursorを使用して変数を作成しますUpdateCursor()
  5. それぞれのためrowにありますcursor
    • count変数を初期化する
    • それぞれのためfieldにありますfields
      • 取得valuefield使用をrow.getValue()
      • value0の場合count、1 ずつ増加
    • 追加したフィールドの値をcount使用に設定しますrow.setValue()
    • 呼び出しcursor.updateRow()、現在を渡しますrow
  6. rowおよびcursor変数を削除します

3

これを行うには、UpdateCursorを開き、次のようなコード(テストされていない)を使用して各行を実行します。

rows = arcpy.UpdateCursor(path)   # path is your shapefile
for row in rows:
  count = 0
  if row.field1 == 0:
    count = count + 1
  if row.field2 == 0:
    count = count + 1
  if row.field3 == 0:
    count = count + 1
  row.num = count

field1からfieldNがある場合は、フィールドをループして、row.getValue()およびrow.setValue()を使用して、ハードワイヤードフィールド名ではなく変数を操作する必要があります。

更新

おそらく、私の回答をヒントとして使用して、@ blah238の演習を完了してください:-)


2
count = count + 1ではなくcount + = 1のより「Pythonらしい」表現が好きですが、それは私だけです。
Fezter

blah238は私を拷問しています!!!
Vasiya

私はより「Pythonic」になることを目指しているので、次回のために覚えておくつもりです-これは、その構文を最後に見たときに私が意図したものです-ありがとう!
PolyGeo

@Vasiya申し訳ありませんが、「人に魚を与え、彼は1日食べ、人に魚を教え、生涯食べる」という格言を聞いたことがあると思います:)
blah238

@ blah238問題は、私が草食動物で、ニシキヘビを食べないことです!!! =)
Vasiya
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.