4 votos

¿Cómo calcular un valor basado en otro campo bajo arcpy.da.UpdateCursor y cursor.updateRow?

Estoy tratando de hacer un cálculo bajo arcpy.da.UpdateCursor. Quiero calcular los valores de los registros que tienen FIPS=06037. Quiero tomar los valores de la columna "kg" y rellenar el nuevo valor multiplicando por 3 en la columna "kg_new".

Creo que no estoy utilizando la sintaxis correcta en

row_field_Name[0] = "!kg!"*3

y para el siguiente FIPS del shapefile , es decir, FIPS=06308,

Quiero tomar el valor de "kg" y multiplicarlo por 5.

    # Set the workspace environment
arcpy.env.workspace = r"E:\Test_Errors_onE\myPath"
arcpy.env.overwriteOutput = True

infc = "myFile.shp"
#Add a new filed named
field1 = ["kg"]

field_Name = "kg_new"
field_Nametype = "DOUBLE"
field_Namename = arcpy.ValidateFieldName(field_Name)
#arcpy.AddField_management(infc, field_Name, field_Nametype, "", "", "")

cursor = arcpy.da.UpdateCursor(infc, field_Name, "\"FIPS\" = 06307")
for row_field_Name in cursor:
    row_field_Name[0] = "!kg!"*3
    cursor.updateRow(row_field_Name)

cursor = arcpy.da.UpdateCursor(infc, field_Name, "\"FIPS\" = 06308"")
for row_field_Name in cursor:
    row_field_Name[0] = "!kg!"*5
    cursor.updateRow(row_field_Name)

5voto

Aaron Puntos 25882

Yo utilizaría el siguiente enfoque que incorpora la lógica para comprobar su código "FIPS".

import arcpy

fc = r"E:\Test_Errors_onE\myPath\myFile.shp"

with arcpy.da.UpdateCursor(fc, ["FIPS", "kg", "kg_new"]) as cursor:
    for row in cursor:
        if row[0] == 06307:
            row[2] = row[1] * 3
        if row[0] == 06308:
            row[2] = row[1] * 5
        cursor.updateRow(row)

1voto

Flinkman Puntos 4821

Parece que te has confundido un poco con la sintaxis del campo, "!kg!" es la sintaxis de python cuando se utiliza en calculadora de campo SOLO.

Creo que esto es lo que buscas:

import arcpy
arcpy.env.workspace = r"E:\Test_Errors_onE\myPath"
arcpy.env.overwriteOutput = True

infc = "myFile.shp"
#Add a new filed named
fields_in_cursor = ["kg","kg_new"] # kg is 0, kg_new is 1

field_Name = "kg_new"
field_Nametype = "DOUBLE"
field_Namename = arcpy.ValidateFieldName(field_Name)

# add field if it does not exist
fList = arcpy.ListFields(infc,field_Name)
if not fList:
    arcpy.AddField_management(infc, field_Name, field_Nametype, "", "", "")

with arcpy.da.UpdateCursor(infc, fields_in_cursor, "\"FIPS\" = '06307'") as cursor:
    for row_field_Name in cursor:
            row_field_Name[1] = row_field_Name[0]*3
            cursor.updateRow(row_field_Name)

with arcpy.da.UpdateCursor(infc, fields_in_cursor, "\"FIPS\" = '06308'") as cursor: 
    for row_field_Name in cursor:
            row_field_Name[1] = row_field_Name[0]*3
            cursor.updateRow(row_field_Name)

En primer lugar, con arcpy.da cursores se limitan los campos con una lista, y luego se indexan en el orden de inclusión.

En segundo lugar, es importante borre sus cursores o dejará bloqueos en los datos y las ediciones pueden no ser confirmadas correctamente. Esto es cierto para arcpy. cursores y arcpy.da. cursores (sólo arcpy.da. soporte de cursores with ) He puesto un with que se deshace del cursor cuando termina.

En tercer lugar, cuando se selecciona un campo de cadena hay que citar el valor. En este caso "\"FIPS\" = '06307'" es para la cadena, "\"FIPS\" = 06307" es para un número (se elimina el 0 inicial, convirtiéndose en "\"FIPS\" = 6307" . Las comillas son opcionales: una consulta de "FIPS = '06307'" funciona igual que "\"FIPS\" = '06307'" cuando se utiliza como consulta de definición en un cursor. El único momento en el que es absolutamente esencial (que yo haya encontrado) utilizar las comillas es cuando se realizan cálculos de campo (no el campo de destino, sólo el campo de origen).

0voto

Wilfrid Puntos 1

Me gusta el método de Aaron, pero dependiendo del tamaño de tu conjunto de datos y de cuántos valores FIPS diferentes tengas, esto podría ser lento. Ese método itera sobre todas las entradas de la FC.

Yo diría que hay que combinar las dos sugerencias con un OR cláusula where:

with arcpy.da.UpdateCursor(infc, fields_in_cursor, "FIPS = '06307' OR FIPS = '06308'") )
......

Entonces aplica el método de Aaron.

Esto reduce los registros que se recorren.

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