Bagaimana cara menghitung nilai nol dalam tabel dalam baris dan menulisnya ke bidang baru?

9

Ini adalah tugas yang sangat sederhana untuk dilakukan tetapi saya tidak dapat memahami sintaks yang tepat.

Saya memiliki shapefile yang atributnya mirip dengan yang berikut:

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

Jumlah bidang dan nama mereka selalu berbeda.

Saya perlu membuat bidang baru (beri nama NUM), dan hitung jumlah nol di setiap baris.

Contoh output:

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

Saya tahu cara membuat bidang baru, namun saya tidak jelas pada langkah selanjutnya.


Kode kerja:

#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

Terima kasih blah238 , sekarang saya bisa makan ular piton!

Vasiya
sumber

Jawaban:

8

Inilah garis besar satu cara untuk melakukan ini. Saya akan menyerahkan coding kepada Anda sebagai latihan.

  1. Baca parameter yang Anda butuhkan, seperti input table
  2. Buat fieldsvariabel menggunakan ListFields(), opsional lewat yang diharapkan field_type, misalnya Panjang
  3. Tambahkan bidang baru, " NUM", ke tablepenggunaanAddField()
  4. Buat cursorvariabel menggunakanUpdateCursor()
  5. Untuk masing-masing rowdalam cursor:
    • Initalize sebuah countvariabel
    • Untuk masing-masing fielddalam fields:
      • Dapatkan valuedari fieldmenggunakanrow.getValue()
      • Jika valuesama dengan 0, tambah count1
    • Setel nilai bidang yang ditambahkan untuk countdigunakanrow.setValue()
    • Panggil cursor.updateRow(), lewat arusrow
  6. Hapus rowdan cursorvariabel
blah238
sumber
3

Untuk melakukan ini, Anda bisa membuka UpdateCursor dan menjalankan melalui setiap baris menggunakan kode (belum diuji) seperti ini.

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

Jika Anda memiliki field1 ke fieldN maka Anda juga perlu mengulang-ulang bidang dan menggunakan row.getValue () dan row.setValue () untuk bekerja dengan variabel daripada nama bidang yang di-bawaan.

MEMPERBARUI

Mungkin menggunakan Jawaban saya sebagai petunjuk untuk menyelesaikan latihan @ blah238 :-)

PolyGeo
sumber
2
Saya lebih suka ekspresi "Pythonic": count + = 1 bukannya count = count + 1 tetapi itu hanya saya.
Fezter
blah238 menyiksaku !!!
Vasiya
Saya bercita-cita untuk menjadi lebih "Pythonic" jadi akan mencoba mengingat untuk waktu berikutnya - yang saya maksud terakhir kali saya melihat sintaks itu - terima kasih!
PolyGeo
@Vasiya menyesal tentang hal itu, tapi saya yakin Anda pernah mendengar pepatah "Berikan seorang pria ikan dan dia makan selama sehari, ajari seorang pria untuk memancing dan dia makan seumur hidup" :)
blah238
@ blah238 Masalahnya adalah saya herbivora dan tidak makan ular piton !!! =)
Vasiya