# How to Populate new field using expression containing MAX value from another field in ArcGIS attribute table using field calculator?

I've got one field X with 10 numerical attributes (float/double).

I've created a new field Y (also float/double) which I need to populate with the percentage of each record/attribute (in each of the 10 rows) relative to the MAX value in field X, i.e. something like Y=X/max(!X!).

I need to do this using the field calculator - in VB script or Python.

Any suggestions? I thought using max before the field name would suffice? (I assumed it was a built-in-function from Python in ArcGIS).

• Please show your code and explain what isn't working as you expected. Do you get an error? If so, what is it? – Ansgar Wiechers Feb 7 '14 at 9:40
• If I use the code above with Python script Y=!X!/max(!X!) it gives me 1 as the result for all the fields as it replaces !X! with the numerical value for each respective row (basically dividing with itself rather than using the max value in field X as the denominator. – GeosDK Feb 7 '14 at 13:19
• If I use VB Script it throws an error saying "There was a failure during processing, check the Geoprocessing Results window for details" (i.e. Error 999999 Error exectuing function). I've tried adding commas - different sorts -, checking spaces etc. Nothing works. – GeosDK Feb 7 '14 at 13:24
• Eventually I resorted to looking for the max value by ascending the values in field X and using that value to the denominator in the field calculator. However, I would still like to find out whether it would be possible for the field calculator to populate a field automatically by searching the cursor for the max value (I know this is possible when looking for max values in multiple fields, but can't find the same for a single field) – GeosDK Feb 7 '14 at 13:25
• I am a beginner in python. For calculating maximum value from numeric field I need use this part of code: maximum = max(row for row in arcpy.da.SearchCursor(fc, ['X'])) But after insertion into the field calculator an error message appears. In field calculator I chose python parser. Any solution? Thank you – user Feb 22 '17 at 16:07

You cannot use the field calculator to find the maximum value within all of the rows in a field. However, the field calculator can perform operations horizontally, among rows using functions like max([!field1!, !field2!, !field3!]).

The only way to accomplish this is by using cursors outside of the field calculator. Try the following workflow:

Use a generator to list all of the row values in X and find the list max

maximum = max(row for row in arcpy.da.SearchCursor(fc, ['X']))


Then loop through each row and perform the calculations:

with arcpy.da.UpdateCursor(fc, ['X','Y']) as cursor:
for row in cursor:
row = row / maximum


--

import arcpy

fc = r'C:\path\to\your\featureclass'

maximum = max(row for row in arcpy.da.SearchCursor(fc, ['X']))

with arcpy.da.UpdateCursor(fc, ['X','Y']) as cursor:
for row in cursor:
row = row / maximum
cursor.updateRow(row)

• I suspected this was the case (not able to find the max value horizontally); your solution works perfectly, thanks. – GeoLuCa Aug 10 '14 at 22:27

I found a solution using arcpy.da.TableToNumPyArray in the Field calculator using Python. It first creates an Array (list) of all the 'X' values. Afterwards the max value is calculated and given a seperate variable. Last step is to divide this maxium value from each 'Y' value ('Scores', in my example below).

def my_rank(score_value):
my_list = arcpy.da.TableToNumPyArray ("Rank_test", "Scores")
my_max = my_list["Scores"].max()
ranking_score = score_value / my_max
return ranking_score

• sorry for the late comment. this works great also, thanks!! – GeoLuCa Jan 29 '16 at 10:30

If there is no other more direct way you could create an empty list and populate it with x field, maximum in a list is then easily found and used to populate the y fields.