Comment compter les valeurs nulles d'une table en lignes et l'écrire dans un nouveau champ?

9

C'est une tâche très simple à faire mais je ne comprends pas la bonne syntaxe.

J'ai un fichier de formes dont les attributs sont similaires aux suivants:

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

Le nombre de champs et leurs noms sont toujours différents.

Je dois créer un nouveau champ (appelons-le NUM) et compter le nombre de zéros dans chaque ligne.

Exemple de sortie:

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

Je sais comment créer un nouveau champ, mais je ne suis pas sûr des prochaines étapes.


Le code de travail:

#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

Merci blah238 , maintenant je peux manger des pythons!

Vasiya
la source

Réponses:

8

Voici un aperçu d'une façon de procéder. Je vous laisse le codage comme exercice.

  1. Lisez les paramètres dont vous avez besoin, tels que l'entrée table
  2. Créer une fieldsvariable à l'aide ListFields(), en passant éventuellement dans l'attendu field_type, par exemple Long
  3. Ajouter un nouveau champ, « NUM», à l' tableaide deAddField()
  4. Créer une cursorvariable à l'aideUpdateCursor()
  5. Pour chacun rowen cursor:
    • Initaliser une countvariable
    • Pour chacun fielden fields:
      • Obtenez le valuede l' fieldaiderow.getValue()
      • Si valueest égal à 0, incrémentez countde 1
    • Définissez la valeur du champ ajouté sur countusingrow.setValue()
    • Appel cursor.updateRow(), passant dans le courantrow
  6. Supprimer les variables rowetcursor
blah238
la source
3

Pour ce faire, vous pouvez ouvrir un UpdateCursor et parcourir chaque ligne en utilisant du code (non testé) comme celui-ci.

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

Si vous avez champ1 à fieldN, vous devrez également parcourir les champs et utiliser row.getValue () et row.setValue () pour travailler avec des noms de champs variables plutôt que câblés.

MISE À JOUR

Peut-être utiliser ma réponse comme astuces pour terminer l'exercice de @ blah238 :-)

PolyGeo
la source
2
J'aime l'expression plus "Pythonic" de: count + = 1 au lieu de count = count + 1 mais c'est juste moi.
Fezter
blah238 me torture !!!
Vasiya
J'aspire à être plus "Pythonic" alors j'essaierai de m'en souvenir pour la prochaine fois - c'est ce que je voulais la dernière fois que j'ai vu cette syntaxe - merci!
PolyGeo
@Vasiya désolé, mais je suis sûr que vous avez entendu le proverbe "Donnez à un homme un poisson et il mange pendant une journée, apprenez à un homme à pêcher et il mange toute sa vie" :)
blah238
@ blah238 Le problème est que je suis herbivore et ne mange pas de pythons !!! =)
Vasiya