Bir tablodaki sıfır değerlerini satırlar halinde nasıl sayabilir ve yeni alana nasıl yazabilirim?


9

Bu çok basit bir iş ama doğru sözdizimini anlayamıyorum.

Öznitelikleri aşağıdakine benzer bir shapefile var:

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

Sayısı alanları ve bunların isimlerinin hep farklıdır.

Yeni bir alan (hadi NUM olarak adlandıralım) oluşturmalı ve her satırdaki sıfır sayısını saymalıyım.

Örnek çıktı:

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

Nasıl yeni bir alan oluşturacağımı biliyorum, ancak sonraki adımlarda net değilim.


Çalışma kodu:

#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

Teşekkürler blah238 , şimdi piton yiyebilirim!

Yanıtlar:


8

İşte bunu yapmanın bir yolu. Kodlamayı size bir egzersiz olarak bırakacağım.

  1. Giriş gibi ihtiyacınız olan parametreleri okuyun table
  2. Bir oluşturma fieldskullanarak değişkeni ListFields()isteğe beklenen ileterek field_type, örneğin Long
  3. "Yeni bir alan ekleyin NUMüzere," tablekullanılarakAddField()
  4. cursorKullanarak değişken oluşturmaUpdateCursor()
  5. Her biri rowiçin cursor:
    • Bir countdeğişkeni canlandırmak
    • Her biri fieldiçin fields:
      • Get valueait fieldkullanılarakrow.getValue()
      • Eğer value0, artış eşittir count1 ile
    • Eklenen alanın değerini ayarlayın countkullanarakrow.setValue()
    • Çağrı cursor.updateRow()akımı geçen,row
  6. rowVe cursordeğişkenlerini sil

3

Bunu yapmak için bir UpdateCursor açabilir ve bu kodu (denenmemiş) kullanarak her satırı çalıştırabilirsiniz.

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 alanınız varsa, alanlar arasında döngü yapmanız ve sabit kablolu alan adları yerine değişkenle çalışmak için row.getValue () ve row.setValue () yöntemini kullanmanız gerekir .

GÜNCELLEME

Belki de cevabımı @ blah238'in egzersizini tamamlamak için ipuçları olarak kullan :-)


2
Ben daha sayısı "Pythonic" ifadesini seviyorum: count = count + 1 yerine count + = 1 ama bu sadece benim.
Fezter

blah238 bana işkence ediyor !!!
Vasiya

Daha "Pythonic" olmayı arzuladığım için bir dahaki sefere hatırlamaya çalışacağım.
PolyGeo

@Vasiya bunun için üzgünüm, ama "Bir adama bir balık verin ve bir günlüğüne yiyor, bir adama balık
tutmayı öğretin

@ blah238 Sorun ben otobur ve piton yemem !!! =)
Vasiya
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.