Come contare zero valori in una tabella in righe e scriverlo in un nuovo campo?


9

Questo è un compito molto semplice da fare ma non riesco a capire la sintassi giusta.

Ho uno shapefile i cui attributi sono simili ai seguenti:

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

Il numero di campi e i loro nomi sono sempre diversi.

Devo creare un nuovo campo (chiamiamolo NUM) e contare il numero di zeri in ogni riga.

Esempio di 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

So come creare un nuovo campo, tuttavia non sono chiaro sui passaggi successivi.


Il codice di lavoro:

#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

Grazie blah238 , ora posso mangiare i pitoni!

Risposte:


8

Ecco uno schema di un modo per farlo. Lascio a te la codifica come esercizio.

  1. Leggi i parametri di cui hai bisogno, come l'input table
  2. Creare una fieldsvariabile utilizzando ListFields(), passando facoltativamente nel previsto field_type, ad esempio Long
  3. Aggiungi un nuovo campo " NUM" tableall'utilizzoAddField()
  4. Crea una cursorvariabile usandoUpdateCursor()
  5. Per ciascuno rowin cursor:
    • Inizializza una countvariabile
    • Per ciascuno fieldin fields:
      • Prendi il valuedi fieldutilizzarerow.getValue()
      • Se è valueuguale a 0, incrementare countdi 1
    • Impostare il valore del campo aggiunto su countusingrow.setValue()
    • Chiama cursor.updateRow(), passando la correnterow
  6. Elimina le variabili rowecursor

3

Per fare ciò è possibile aprire un UpdateCursor ed eseguire ogni riga utilizzando il codice (non testato) in questo modo.

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

Se hai field1 a fieldN, dovrai anche scorrere i campi e utilizzare row.getValue () e row.setValue () per lavorare con i nomi dei campi variabili anziché cablati.

AGGIORNARE

Forse usa la mia risposta come suggerimento per completare l'esercizio di @ blah238 :-)


2
Mi piace l'espressione più "Pythonic" di: count + = 1 invece di count = count + 1 ma sono solo io.
Fezter

blah238 mi sta torturando !!!
Vasiya,

Aspiro ad essere più "Pythonic", quindi cercherò di ricordare per la prossima volta - che è quello che intendevo l'ultima volta che ho visto quella sintassi - grazie!
PolyGeo

@Vasiya mi dispiace, ma sono sicuro che hai sentito il proverbio "Dai a un uomo un pesce e mangia per un giorno, insegna a un uomo a pescare e mangia per tutta la vita" :)
blah238

@ blah238 Il problema è che sono erbivoro e non mangio pitoni !!! =)
Vasiya,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.