Wie zähle ich Nullwerte in einer Tabelle in Zeilen und schreibe sie in ein neues Feld?

9

Dies ist eine sehr einfache Aufgabe, aber ich kann die richtige Syntax nicht verstehen.

Ich habe ein Shapefile, dessen Attribute den folgenden ähnlich sind:

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

Die Anzahl der Felder und ihre Namen sind immer unterschiedlich.

Ich muss ein neues Feld erstellen (nennen wir es NUM) und die Anzahl der Nullen in jeder Zeile zählen.

Beispielausgabe:

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

Ich weiß, wie man ein neues Feld erstellt, bin mir aber bei den nächsten Schritten nicht sicher.


Der Arbeitscode:

#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

Danke blah238 , jetzt kann ich Pythons essen!

Vasiya
quelle

Antworten:

8

Hier ist ein Überblick über einen Weg, dies zu tun. Ich überlasse Ihnen die Codierung als Übung.

  1. Lesen Sie die gewünschten Parameter, z. B. die Eingabe table
  2. Erstellen Sie eine fieldsVariable mit ListFields(), indem Sie optional das Erwartete übergeben field_type, z. B. Long
  3. Fügen Sie ein neues Feld, „ NUM“, auf die tableVerwendung vonAddField()
  4. Erstellen Sie eine cursorVariable mitUpdateCursor()
  5. Für jeden rowin cursor:
    • Eine countVariable initialisieren
    • Für jeden fieldin fields:
      • Holen Sie sich das valuevon fieldmitrow.getValue()
      • Wenn valuegleich 0, erhöhen Sie countum 1
    • Stellen Sie den Wert des hinzugefügten Felds auf countusing einrow.setValue()
    • Rufen Sie cursor.updateRow()an und geben Sie den Strom weiterrow
  6. Löschen Sie die Variablen rowundcursor
blah238
quelle
3

Dazu können Sie einen UpdateCursor öffnen und jede Zeile mit Code (ungetestet) wie diesem durchlaufen.

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

Wenn Sie Feld1 bis FeldN haben, müssen Sie auch die Felder durchlaufen und row.getValue () und row.setValue () verwenden , um mit variablen und nicht fest verdrahteten Feldnamen zu arbeiten.

AKTUALISIEREN

Vielleicht benutze ich meine Antwort als Hinweis, um die Übung von @ blah238 abzuschließen :-)

PolyGeo
quelle
2
Ich mag den eher "pythonischen" Ausdruck von: count + = 1 anstelle von count = count + 1, aber das bin nur ich.
Fezter
blah238 quält mich !!!
Vasiya
Ich strebe danach, mehr "Pythonic" zu sein, also werde ich versuchen, mich für das nächste Mal zu erinnern - was ich beabsichtigt habe, als ich diese Syntax das letzte Mal gesehen habe - danke!
PolyGeo
@Vasiya Entschuldigung, aber ich bin sicher, Sie haben das Sprichwort "Geben Sie einem Mann einen Fisch und er isst für einen Tag, lehren Sie einen Mann zu fischen und er isst ein Leben lang" :)
blah238
@ blah238 Das Problem ist, dass ich Pflanzenfresser bin und keine Pythons esse !!! =)
Vasiya