6 votos

Usando, COMO en un Bucle For con UpdateCursor

Tengo un clasificado de trama con un valor de la clase que es una muy larga cadena concatenada nombre (Nombre_clase a continuación). Estoy tratando de utilizar arcpy para generar entero etiquetas que van desde 1-24 (que son la tercera concatenados sub-grupo en estas largas cadenas). He aquí un ejemplo de una anterior (manipulados) similar la tabla de atributos de ráster. enter image description here

Hasta ahora he sido de forma manual utilizando criterios de búsqueda en ERDAS para encontrar las clases que pertenecen al mismo grupo, tales como:

$"Class_Names" contains "-14.01-" or $"Class_Names" contiene "-14.02-" o $"Class_Names" contiene "-14.03-"

He intentado usar el siguiente código (como prueba para las dos primeras clases), COMO en un bucle for con UpdateCursor, pero me da un error de sintaxis para mi COMO declaración.

in_table = 'l12wm_agsup02.img'
field_names = ['Class_Name', 'crop']
with arcpy.da.UpdateCursor(in_table, field_names) as cursor:
    for row in cursor:
        if row[0] 'LIKE \'1.%\'':
            row[1] = 1
        elif row[0] 'LIKE \'2.%\'':
            row[1] = 2
        cursor.updateRow(row)

He mirado en el Uso COMO en la cláusula de actualización de cursor da error de sintaxis? y https://community.esri.com/thread/87848 pero no puede averiguar cómo usar COMO en el caso de else en lugar de como una cláusula where en UpdateCursor.

Estoy usando ArcMap 10.5, Python 2.7

Gracias!

4voto

Aaron Puntos 25882

Me gustaría aislar a la clase que está después de, en lugar de buscarlo. Luego, basta con asignar row[1] que aislado valor. Por ejemplo:

in_table = 'l12wm_agsup02.img'
field_names = ['Class_Name', 'crop']
with arcpy.da.UpdateCursor(in_table, field_names) as cursor:
    for row in cursor:
        row[1] = row[0].split("-")[2].split(".")[0]
        cursor.updateRow(row)

2voto

John Kramlich Puntos 286

Esto no tiene que ser hecho en una secuencia de comandos de python, se puede hacer de forma más sencilla, utilizando la herramienta calcular campo como se muestra a continuación:

Tool

Si desea ejecutar esto como python, el código sería el siguiente:

arcpy.CalculateField_management("myRaster","crop","cropnumber( !class! )","PYTHON_9.3","""def cropnumber(s):/n  if s.find("-1.") != -1:/n    return 1/n  elif s.find("-2.") != -1 :/n    return 2/n  else:/n    return -999""")

1voto

Anton8000 Puntos 165

Usted puede utilizar el in operador, por ejemplo:

with arcpy.da.UpdateCursor(in_table, field_names) as cursor:
    for row in cursor:
        if '1.' in row[0]:
            row[1] = 1
...

Y en lugar de escribir 24 si las declaraciones se puede utilizar un diccionario:

d = {'1.':1, '2.':2, '3.':3} #add all values here

with arcpy.da.UpdateCursor(in_table, field_names) as cursor:
    for row in cursor:
        for key in d:
            if key in row[0]:
                row[1]=d[row[0]]
                cursor.updateRow(row)

Pero este no trabajo desde '2.' en tanto '12." y "22." así que usted puede hacer:

row[1] = row[0].split('-')[2].split('.')[0]

1voto

Sushant23 Puntos 329

Usted puede analizar su texto basado en el guión (-) para dividir el texto y seleccione el 3er número de convertir a entero. Pruebe el siguiente código en python en el campo de la calculadora:

def select(f):
    if f == ' ':
        return 0
    else:
        txt = f.split("-")[2]
        digit = int(round(float(txt),0))
        return digit

El código anterior asume toda la columna de Class_Name está lleno de información con la misma estructura. Si el campo está vacío de texto, se devolverá cero (0). Sin embargo, he utilizado round() función para redondear la clase al número entero más cercano en caso de tener algo como 4.98, devolverá 5 en lugar de 4. Pero, si desea truncar los números de un dígito, usted puede simplemente cambiar la línea:

digit = int(round(float(txt),0))

a:

digit = int(float(txt))

enter image description here

Aquí se muestra la salida:

enter image description here

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