4 votos

Cálculo de campo- Arcpy

Estoy desarrollando un script para calcular los valores de dos campos (C y D) basado en el valor de Un campo (es una función de Punto):

A C D
0.2 1 1
0.2 1 2
0.2 1 3
0.4 2 1
0.5 3 1
0.5 3 2

Así que la idea es

n = 1
k =0
while i < endrow
{
if a[i]==a[i+1]
c[i]=n
d[i] = k+1
if a[i] < a[i+1]
i=i+1
k=0
c[i]=n+1
d[i]= k+1
}

No estoy seguro - cursor me puede ayudar. Pero, ¿hay alguna manera para que este tipo de comparación y actualización de la columna?

Gracias

la adición de otra complicación de campo E, que tiene el máximo de D para cada a o C; por lo que será:

 A C D  E
0.2 1 1 3
0.2 1 2 3
0.2 1 3 3
0.4 2 1 1
0.5 3 1 2
0.5 3 2 2

Porque en última instancia, mi objetivo es mantener sólo D ==1 etiqueta y el resto de los puntos C y E (decir: hay 3 puntos en 1 ubicación)

A C D  E
0.2 1 1 3
0.4 2 1 1
0.5 3 1 2

Ahora aparece, tengo que correr otra combinación de búsqueda y actualización de cursor después de que el cálculo de la C y la D, pero si hay algún otro concisa y elegante, enfoque! Si voy a averiguar - voy a publicar aquí!

4voto

Burcu Tunca Puntos 18

Sin sangrías, no estoy seguro de lo que quiere decir que su código para hacer. De la tabla se dio, parece que quieres C para contar el número de valores únicos de hasta que punto, y D para contar el número de veces que el valor actual de Una recidivó (por lo que una vez es de 1, dos veces en una fila es de 2, etc.) Si esto es correcto, y si los valores en Una están ascendiendo, esto debería funcionar (yo estoy en casa, así que no puedo comprobar con arcpy, por desgracia):

import arcpy

# create the cursor and populate the C and D fields of the
# first row.
cur = arcpy.UpdateCursor('TableNameHere')
row = cur.next()
last = row.getValue('A') # the last value in field A

row.setValue('C', 1)
row.setValue('D', 1)
cur.updateRow(row)

run = 1 # how many values in this run
count = 1 # how many runs so far, including the current one

# the for loop should begin from row 2, since
# cur.next() has already been called once.
for row in cur:
    current = row.getValue('A')

    if current == last:
        run += 1
    else:
        run = 1
        count += 1
    row.setValue('C', count)
    row.setValue('D', run)
    cur.updateRow(row)

    last = current

# release the layer from locks
del row, cur

Sustituir la ruta de la tabla de TableNameHere y los nombres de campo correcto para Un, B y C, por supuesto.

3voto

Aissen Puntos 131

Este es un corte en bruto a su problema; No lo he probado, pero la lógica generalmente debería ser lo que necesitas:

 import arcpy

tbl = r'path\to\db.mdb\table'

#-Get field objects in table
fields = arcpy.ListFields(tbl)

#-Create an empty list to hold row data in memory
data = []

rows = arcpy.SearchCursor(tbl)
for row in rows:
    #-Create an empty dictionary to store each row
    d = {}
    for f in fields:
        d[f.name] = row.getValue(f.name)
    data.append(d)
del row,rows

n = 1
k = 0
i = 0
less_than = False
rows = arcpy.UpdateCursor(tbl)
for row in rows:
    if less_than:
        #-update rows c and d with the appropriate values
        row.c = n+1
        row.d = k+1
        less_than = False
    else:
        if row.a == data[i+1][a]:
            #-update rows c and d with the appropriate values
            row.c = n
            row.d = k+1
        elif row.a < data[i+1][a]:
            #-set flag and skip to the next row
            less_than = True
    i+=1
    rows.updateRow(row)
del row,rows
 

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