I need to populate a column (Level4Code) with the field calculator that counts sequentially based on another column (Level3Name) and includes 4 digits. Here is an example of a table that's already populated correctly:
Level3Name | Level4Code |
---|---|
Adilabad | 0001 |
Adilabad | 0002 |
Adilabad | 0003 |
Agar Malwa | 0001 |
Agar Malwa | 0002 |
Agra | 0001 |
Agra | 0002 |
The out of the box sequential code does not do it correctly since it doesn't loop based on any other column.
So far, I've tried this code snippet to count but I am not getting the results I need. This only seems to count the total number of times that word in Level3Name is present:
Any suggestions? I am new to Python so any help would be great.
Update: Using this python script I was able to have it count properly and populate the needed column. I guess now I just need to know how to set it to have 4 digits with leading 0's (ie 0001 instead of 1, or 0110 instead of 110). Any suggestions?
tbl = r'C:\my\data.gdb\table'
data_dict = defaultdict(int)
with arcpy.da.UpdateCursor(tbl, ["Level3Name", "Level4Code"]) as cur:
for uniq, code in cur:
data_dict[uniq] += 1
cur.updateRow([uniq, data_dict[uniq]])
As you have learned, or maybe just coincidentally avoided, using Field Calculator for creating sequential numbering runs into problems if the sequencing doesn't line up with the ObjectID sequence.
Regarding your follow-up question, do you want to have the data stored as "000x" etc... or do you just want the formatting for a table you are looking at to be that way? If the former, you need Level4Code to be a string field and use string formatting. If the latter, you can create a custom number formatting for that field in the table in Pro.
The following should work for string formatting:
cur.updateRow([uniq, "{:0>4}".format(data_dict[uniq])])