2 votos

Clasificación de ocurrencias en el campo utilizando ArcPy?

Tengo un campo C_CODE y me gustaría contar las ocurrencias de los valores en ese campo que comenzarán con el cero delante de los números de un dígito:Ej: 01,02 y normalmente para los números de dos dígitos Ej:..09,10,11,etc

Se busca salida:

C_CODE RANK  C_CODE_FINAL                        #Info#
17      01       1701      # RANK counts how many times each value in C_CODE exists
15      01       1501      # C_CODE_FINAL is a concatenation of the other fields
23      01       2301
29      01       2901
15      02       1502
19      01       1901
17      02       1702
15      03       1503
37      01       3701

y luego concatenar los campos en C_CODE_FINAL .

Probado:

fc = path to shp
field = "C_CODE"

#Create dictionary to store unique values
count_values = {}
arcpy.AddField_management (fc, 'rank', 'LONG')
with arcpy.da.SearchCursor (fc, field) as cursor:
    for row in cursor:
        if not row[0] in count_values.keys():
            count_values[row[0]] = 1
        else:
            count_values[row[0]] += 1

Devuelve una columna de rango llena de ceros aunque hay muchos valores que existen varias veces. Además tienen que empezar por 01 para los valores que aparecen por primera vez.

1voto

Justin Puntos 1169

El primer problema es que tienes el nuevo campo "rango" definido como un long. Eso está bien, pero no puedes controlar directamente el formato de los datos; tendrás que formatear la visualización. Si debes almacenarlo con un cero a la izquierda, hazlo un campo de texto. Lo mismo podría ocurrir con C_CODE_FINAL.

A menos que esté entendiendo mal el requisito, debería ser más fácil usar un UpdateCursor y actualizar los valores a medida que se mueve por el cursor.

Lo siguiente es un código parcial (añadir código para crear campos según sea necesario) y no probado:

fields = ["C_CODE", 'RANK', 'C_CODE_FINAL']

with arcpy.da.UpdateCursor (fc, fields) as cursor:
    for row in cursor:
        if not row[0] in count_values.keys():
            count_values[row[0]] = 1
        else:
            count_values[row[0]] += 1
        row[1] = count_values[row[0]]
        row[2] = str(row[0]) + str(row[1]).zfill(2)
        cursor.updateRow(row)

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