Jak liczyć wartości zerowe w tabeli w wierszach i zapisywać je w nowym polu?

9

Jest to bardzo proste zadanie, ale nie rozumiem właściwej składni.

Mam plik kształtu, którego atrybuty są podobne do następujących:

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

Liczba pól i ich nazwy są zawsze różne.

Muszę utworzyć nowe pole (nazwijmy je NUM) i policz liczbę zer w każdym wierszu.

Przykładowe dane wyjściowe:

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

Wiem, jak utworzyć nowe pole, ale nie jestem pewien, co robić dalej.


Działający kod:

#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

Dzięki blah238 , teraz mogę jeść pytony!

Vasiya
źródło

Odpowiedzi:

8

Oto zarys jednego ze sposobów, aby to zrobić. Zostawiam ci kodowanie jako ćwiczenie.

  1. Przeczytaj potrzebne parametry, takie jak dane wejściowe table
  2. Utwórz fieldszmienną za pomocą ListFields(), opcjonalnie przekazując oczekiwane field_type, np. Long
  3. Dodaj nowe pole „ NUM” do tableużywanegoAddField()
  4. Utwórz cursorzmienną za pomocąUpdateCursor()
  5. Dla każdego roww cursor:
    • Zainicjuj countzmienną
    • Dla każdego fieldw fields:
      • Uzyskać valuez fieldużyciemrow.getValue()
      • Jeśli valuewynosi 0, przyrost counto 1
    • Ustaw wartość dodanego pola na countza pomocąrow.setValue()
    • Zadzwoń cursor.updateRow(), przekazując prądrow
  6. Usuń zmienne rowicursor
blah238
źródło
3

Aby to zrobić, możesz otworzyć UpdateCursor i uruchomić każdy wiersz za pomocą kodu (niesprawdzonego) w ten sposób.

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

Jeśli masz pole od pola1 do pola N, będziesz musiał także zapętlić pola i użyć row.getValue () i row.setValue () do pracy ze zmiennymi, a nie przewodowymi nazwami pól.

AKTUALIZACJA

Być może użyj mojej odpowiedzi jako wskazówki, aby ukończyć ćwiczenie @ blah238 :-)

PolyGeo
źródło
2
Podoba mi się bardziej „pytoniczne” wyrażenie: count + = 1 zamiast count = count + 1, ale to tylko ja.
Fezter
blah238 torturuje mnie !!!
Vasiya,
Dążę do tego, by być bardziej „Pythońskim”, więc postaram się zapamiętać następnym razem - to jest to, co zamierzałem ostatnim razem, gdy zobaczyłem tę składnię - dzięki!
PolyGeo
@Vasiya przepraszam, ale jestem pewien, że słyszałeś przysłowie: „Daj człowiekowi rybę, a zje na dzień, uczyć człowieka do ryb i zjada na całe życie” :)
blah238
@ blah238 Problem polega na tym, że jestem roślinożercą i nie jem pytonów !!! =)
Vasiya