Si utilizaras un script podría calcular todos los campos a la vez. Si utilizaras la calculadora de campos, tendrías que ejecutarla en cada campo que quisieras actualizar (5x).
El siguiente script actualizará sus campos Dom en el orden de los valores de sus campos de cobertura terrestre. Si varios campos tienen el mismo valor, se añadirá el nombre de cada campo según su ejemplo. He probado el script con los datos de dumby y me funciona. Dicho esto, puede que no sea el método más eficiente.
EDITAR: Ahora el script extrae dinámicamente los nombres de los campos del conjunto de datos. Busca "PRC" en el nombre del campo para denotar un tipo de cubierta terrestre y "Dom" para un campo dominante. Sólo se escriben los campos con valores superiores a cero, dejando en blanco los campos Dom restantes.
Hay bastantes decimales, por lo que los únicos valores repetidos (según los datos ficticios que has enviado) son ceros. Tal vez esto es diferente en todo el conjunto de datos, así que no pude probar la sección que escribe múltiples nombres de campo en una columna.
import arcpy
# Put the absolute path to your table / feature class
theData = r"C:YourPathHere"
# Create empty Python list, and a list of field names
values = []
fields = []
domFields = []
# Get all landcover and Dom field names dynamically
for field in arcpy.ListFields(theData):
if 'PRC' in field.name:
fields.append(field.name) # Grab all fields names that contain "PRC"
elif 'Dom' in field.name:
domFields.append(field.name)
# Arcpy Update cursor
rows = arcpy.UpdateCursor(theData)
# Loop through each row in your attribute table
for row in rows:
i = 0
while i < len(fields):
# Store the fieldname and value in a tuple, add to list ex. [("PRC_Water", 5), ("PRC_Bare", 10), etc.]
values.append((fields[i], row.getValue(fields[i])))
i += 1 # iterate counter
# Sort the list of tuples based on the integer value in descending order
values = sorted(values, key=lambda value: value[1], reverse=True)
sortedFields = [x[0] for x in values] # Grab the ordered field names
sortedValues = [x[1] for x in values] # Grab the ordered field values
# Set the values of Dominance fields based on the order of the list
j = 0
while j < len(domFields):
if sortedValues[j] > 0:
row.setValue(domFields[j], sortedFields[j])
else: # if the next greatest value is zero, leave the field blank
row.setValue(domFields[j], "")
j += 1 # iterate counter
rows.updateRow(row)
# This section handles cases where multiple landuse values are equal
k=0
while k < len(fields):
fieldsEqual = ""
startRepeat = 0
numRepeat = 0
# If two fields contain the same value...
if sortedValues.count(sortedValues[k]) > 1:
# Find the position in the list where they begin to repeat (repeated values will occur back-to-back)
startRepeat = sortedValues.index(sortedValues[k])
# Find the number of times the value is repeated
numRepeat = sortedValues.count(sortedValues[k])
l = 0
# While the counter is less than the number of repeated values, append the field name to a string
while l < numRepeat:
fieldsEqual += sortedFields[startRepeat + l]
# Add a comma and space to each value except the last one
if l < numRepeat - 1:
fieldsEqual += ", "
l += 1 # iterate counter
# Write the fields with equal values into the Dom fields
m = 0
while l < numRepeat:
row.setValue(domFields[startRepeat + m] , fieldsEqual)
rows.updateRow(row)
m += 1 # iterate counter
k += 1 # iterate counter
# Clear the list for the next row of data
values = []
# Delete cursor objs
del row, rows