¿Cómo contar valores cero en una tabla en filas y escribirlo en un nuevo campo?

9

Esta es una tarea muy simple pero no puedo entender la sintaxis correcta.

Tengo un archivo de forma cuyos atributos son similares a los siguientes:

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

El número de campos y sus nombres son siempre diferentes.

Necesito crear un nuevo campo (nombremos NUM) y contar el número de ceros en cada fila.

Salida de ejemplo:

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

Sé cómo crear un nuevo campo, sin embargo, no tengo claros los próximos pasos.


El código de trabajo:

#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

Gracias blah238 , ¡ahora puedo comer pitones!

Vasiya
fuente

Respuestas:

8

Aquí hay un resumen de una forma de hacer esto. Te dejaré la codificación como ejercicio.

  1. Lea los parámetros que necesita, como la entrada table
  2. Cree una fieldsvariable usando ListFields(), opcionalmente pasando el esperado field_type, por ejemplo, Largo
  3. Añadir un nuevo campo, " NUM", al tableutilizarAddField()
  4. Crear una cursorvariable usandoUpdateCursor()
  5. Para cada uno rowen cursor:
    • Inicializar una countvariable
    • Para cada uno fielden fields:
      • Obtener el valuede fieldusarrow.getValue()
      • Si valuees igual a 0, incremente counten 1
    • Establezca el valor del campo agregado para countusarrow.setValue()
    • Llamada cursor.updateRow(), pasando la corrienterow
  6. Eliminar las variables rowycursor
blah238
fuente
3

Para hacer esto, puede abrir un cursor de actualización y ejecutar cada fila utilizando un código (no probado) como este.

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 tiene field1 a fieldN, entonces también deberá recorrer los campos y usar row.getValue () y row.setValue () para trabajar con nombres de campo variables en lugar de cableados.

ACTUALIZAR

Tal vez use mi respuesta como pistas para completar el ejercicio de @ blah238 :-)

PolyGeo
fuente
2
Me gusta la expresión más "pitónica" de: cuenta + = 1 en lugar de cuenta = cuenta + 1, pero eso soy solo yo.
Fezter
¡blah238 me está torturando!
Vasiya
Aspiro a ser más "Pythonic", así que intentaré recordar la próxima vez, que es lo que pretendía la última vez que vi esa sintaxis, ¡gracias!
PolyGeo
@Vasiya lo siento, pero estoy seguro de que has escuchado el proverbio "Dale a un hombre un pescado y él come por un día,
enséñale
@ blah238 ¡El problema es que soy herbívoro y no como pitones! =)
Vasiya