9 votos

¿Cómo contar valores cero en una tabla de filas y escribir en nuevo campo?

Esta es una tarea muy sencilla de hacer pero no puedo entender la sintaxis.

Tengo un shapefile, 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 campo nuevo (el nombre NUM), y contar el número de ceros que hay en cada fila.

Ejemplo de salida:

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 estoy claro sobre 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!

8voto

auramo Puntos 161

He aquí un esbozo de una manera de hacer esto. Voy a dejar la codificación como un ejercicio.

  1. Leer el parámetro(s) que usted necesita, tales como la entrada table
  2. Crear un fields variable ListFields(), opcionalmente pasando en la esperada field_type, por ejemplo, de Largo
  3. Agregar un nuevo campo, "NUM", a la table uso de AddField()
  4. Crear un cursor variable UpdateCursor()
  5. Para cada row en cursor:
    • Iniciar un count variable
    • Para cada field en fields:
      • Obtener el value de field uso de row.getValue()
      • Si value es igual a 0, el incremento count 1
    • Establecer el valor del campo count uso de row.setValue()
    • Llame a cursor.updateRow(), pasando el actual row
  6. Borrar el row y cursor variables

3voto

UnkwnTech Puntos 21942

Para hacer esto usted podría abrir un UpdateCursor y ejecutar a través de cada fila utilizando el 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 usted tiene campo1 fieldN entonces usted necesitará también de bucle a través de los campos y el uso de la fila.getValue() y fila.setValue() para trabajar con variables en lugar de cableado nombres de campo.

ACTUALIZACIÓN

Tal vez uso mi Respuesta como sugerencias para completar @blah238 del ejercicio :-)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X