<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Calculate Percentage of Field Value in a Row in Python Questions</title>
    <link>https://community.esri.com/t5/python-questions/calculate-percentage-of-field-value-in-a-row/m-p/1499990#M70959</link>
    <description>&lt;P&gt;Hi all, I've been trying to automate the calculation of some land cover percentages per area, but I'm not a programmer so I'm not sure how to fix where I've gotten stuck. So far, I have been able to create and calculate a field with the sum of all of the area values, and new fields for the percentage calculations to be in.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;import arcpy&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;#Set path to the feature class or the table put name within the quotations&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;table = &lt;/SPAN&gt;&lt;SPAN&gt;r""&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;# Add a new field to the table&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;arcpy.management.AddField(table, "SumField", "DOUBLE")&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;# Use UpdateCursor to iterate through the rows of the table&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;with arcpy.da.UpdateCursor(table, "*") as cursor:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for row in cursor:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# Initialize a variable to store the sum&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total = 0&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# Iterate through each field in the row&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i in range(len(row)):&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# Check if the field is numeric and not OBJECTID, Shape_Length, and Shape_Area&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if isinstance(row[i], (int, float, complex)) and cursor.fields[i] not in ['OBJECTID', 'Shape_Length', 'Shape_Area']:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# Add the field's value to the total&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total += row[i]&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# Update the new field with the total&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;row[cursor.fields.index('SumField')] = total&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cursor.updateRow(row)&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;#make fields into a list&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;fields = arcpy.ListFields(&lt;/SPAN&gt;&lt;SPAN&gt;""&lt;/SPAN&gt;&lt;SPAN&gt;)&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;for field in fields:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#exclude fields with these names&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if field.name not in ['OBJECTID', 'Shape_Length', 'Shape_Area', 'SumField', 'Spatial_ID']:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#add copies of all not excluded fields adding _perc after the name&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;arcpy.management.AddField(table, field.name + "_perc", "DOUBLE")&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot of testing table after running the code above." style="width: 991px;"&gt;&lt;img src="https://community.esri.com/t5/image/serverpage/image-id/108486iEC948F3160D80C76/image-size/large?v=v2&amp;amp;px=999" role="button" title="Screenshot 2024-07-01 135755.png" alt="Screenshot 2024-07-01 135755.png" /&gt;&lt;/span&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;I've tried a few things to calculate these new fields, including using CalculateField() in the place of AddField(), but I wasn't able to get the expression to work because referencing a variable which is a field name breaks it and makes it think they're both strings instead of using the values within the fields.&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;fields = arcpy.ListFields("perc_test_table")&lt;BR /&gt;for field in fields:&lt;BR /&gt;&amp;nbsp; &amp;nbsp; if field.name not in ['OBJECTID', 'Shape_Length', 'Shape_Area', 'SumField', 'Spatial_ID']:&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; field_name = "'!"+ field.name+ "!'"&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; arcpy.management.CalculateField(table, field.name + "_perc", field_name/'!SumField!', "PYTHON3",field_type="DOUBLE")&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thank you!&lt;/P&gt;</description>
    <pubDate>Mon, 01 Jul 2024 18:01:54 GMT</pubDate>
    <dc:creator>haitemar</dc:creator>
    <dc:date>2024-07-01T18:01:54Z</dc:date>
    <item>
      <title>Calculate Percentage of Field Value in a Row</title>
      <link>https://community.esri.com/t5/python-questions/calculate-percentage-of-field-value-in-a-row/m-p/1499990#M70959</link>
      <description>&lt;P&gt;Hi all, I've been trying to automate the calculation of some land cover percentages per area, but I'm not a programmer so I'm not sure how to fix where I've gotten stuck. So far, I have been able to create and calculate a field with the sum of all of the area values, and new fields for the percentage calculations to be in.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;import arcpy&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;#Set path to the feature class or the table put name within the quotations&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;table = &lt;/SPAN&gt;&lt;SPAN&gt;r""&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;# Add a new field to the table&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;arcpy.management.AddField(table, "SumField", "DOUBLE")&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;# Use UpdateCursor to iterate through the rows of the table&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;with arcpy.da.UpdateCursor(table, "*") as cursor:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for row in cursor:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# Initialize a variable to store the sum&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total = 0&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# Iterate through each field in the row&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i in range(len(row)):&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# Check if the field is numeric and not OBJECTID, Shape_Length, and Shape_Area&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if isinstance(row[i], (int, float, complex)) and cursor.fields[i] not in ['OBJECTID', 'Shape_Length', 'Shape_Area']:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# Add the field's value to the total&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total += row[i]&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# Update the new field with the total&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;row[cursor.fields.index('SumField')] = total&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cursor.updateRow(row)&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;#make fields into a list&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;fields = arcpy.ListFields(&lt;/SPAN&gt;&lt;SPAN&gt;""&lt;/SPAN&gt;&lt;SPAN&gt;)&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;for field in fields:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#exclude fields with these names&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if field.name not in ['OBJECTID', 'Shape_Length', 'Shape_Area', 'SumField', 'Spatial_ID']:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#add copies of all not excluded fields adding _perc after the name&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;arcpy.management.AddField(table, field.name + "_perc", "DOUBLE")&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Screenshot of testing table after running the code above." style="width: 991px;"&gt;&lt;img src="https://community.esri.com/t5/image/serverpage/image-id/108486iEC948F3160D80C76/image-size/large?v=v2&amp;amp;px=999" role="button" title="Screenshot 2024-07-01 135755.png" alt="Screenshot 2024-07-01 135755.png" /&gt;&lt;/span&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;I've tried a few things to calculate these new fields, including using CalculateField() in the place of AddField(), but I wasn't able to get the expression to work because referencing a variable which is a field name breaks it and makes it think they're both strings instead of using the values within the fields.&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;fields = arcpy.ListFields("perc_test_table")&lt;BR /&gt;for field in fields:&lt;BR /&gt;&amp;nbsp; &amp;nbsp; if field.name not in ['OBJECTID', 'Shape_Length', 'Shape_Area', 'SumField', 'Spatial_ID']:&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; field_name = "'!"+ field.name+ "!'"&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; arcpy.management.CalculateField(table, field.name + "_perc", field_name/'!SumField!', "PYTHON3",field_type="DOUBLE")&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thank you!&lt;/P&gt;</description>
      <pubDate>Mon, 01 Jul 2024 18:01:54 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/calculate-percentage-of-field-value-in-a-row/m-p/1499990#M70959</guid>
      <dc:creator>haitemar</dc:creator>
      <dc:date>2024-07-01T18:01:54Z</dc:date>
    </item>
    <item>
      <title>Re: Calculate Percentage of Field Value in a Row</title>
      <link>https://community.esri.com/t5/python-questions/calculate-percentage-of-field-value-in-a-row/m-p/1500082#M70966</link>
      <description>&lt;P&gt;You can use an &lt;A href="https://docs.python.org/3/tutorial/inputoutput.html#formatted-string-literals" target="_self"&gt;f-string&lt;/A&gt; to dynamically insert the field name into the calculate field expression.&lt;/P&gt;&lt;LI-CODE lang="python"&gt;fields = arcpy.ListFields("perc_test_table")
for field in fields:
    if field.name not in ['OBJECTID', 'Shape_Length', 'Shape_Area', 'SumField', 'Spatial_ID']:
        arcpy.management.CalculateField(table, f"{field.name}_perc", f"!{field.name}!/!SumField!", "PYTHON3", field_type="DOUBLE")&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 01 Jul 2024 20:53:17 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/calculate-percentage-of-field-value-in-a-row/m-p/1500082#M70966</guid>
      <dc:creator>BlakeTerhune</dc:creator>
      <dc:date>2024-07-01T20:53:17Z</dc:date>
    </item>
    <item>
      <title>Re: Calculate Percentage of Field Value in a Row</title>
      <link>https://community.esri.com/t5/python-questions/calculate-percentage-of-field-value-in-a-row/m-p/1501460#M70988</link>
      <description>&lt;P&gt;You're doing a lot of work inside the update cursor, see if this works for you:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="python"&gt;import arcpy
from arcpy.da import SearchCursor, UpdateCursor, InsertCursor, Editor

table = r"path/to/your/table"

fields = arcpy.Describe(table).fields
for idx, field in enumerate(fields):
    # Notify User of progress
    print(f"Calculating percentage for field: {field.name} {idx}/{len(fields)}")
    # Skip not numeric fields
    if field.type not in ['Double', 'Integer', 'BigInteger', 'Single', 'SmallInteger',]: continue
    # Skip system fields
    if field.name in ['OBJECTID', 'Shape_Length', 'Shape_Area', 'SumField']: continue
    # Calculate the sum of the field values
    total = sum(val[0] for val in arcpy.da.SearchCursor(table, [field.name]) if val[0])
    # Skip if no values
    if not total: continue
    # Add _perc field
    arcpy.management.AddField(table, field.name + "_perc", "DOUBLE")
    # Start update cursor
    with UpdateCursor(table, [field.name, field.name + "_perc"]) as cursor:
        for row in cursor:
            row = dict(zip(cursor.fields, row))
            # Calculate the percentage of the field value (rounded to 2 decimal places)
            row[f"{field.name}_perc"] = round((row[field.name] / total) * 100, 2)
            cursor.updateRow(list(row.values()))&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Notice that there's barely anything happening in the cursor&lt;/P&gt;</description>
      <pubDate>Fri, 05 Jul 2024 16:48:40 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/calculate-percentage-of-field-value-in-a-row/m-p/1501460#M70988</guid>
      <dc:creator>HaydenWelch</dc:creator>
      <dc:date>2024-07-05T16:48:40Z</dc:date>
    </item>
  </channel>
</rss>

