Thursday, 14 December 2017

arcmap - Referring to Null value with ArcPy Expressions?


How do I refer to Null values in a field using an expression in Python?


I've tried using the following as well as = None and =Null but nothing has worked yet:


ScoreCondition = "Cond_Score(!"+Condition+"!)"

codeblock1 = """def Cond_Score(cond):
if cond > 90:
return 1
elif cond >= 71 and cond <= 90:
return 2
elif cond >= 51 and cond <= 70:
return 3
elif cond >= 20 and cond <= 50:
return 4
elif cond < 20:

return 5
elif cond is None:
return 1"""

Answer



Your problem is that in Python 2 None is less than everything.


>>> None < 20
True
>>> None < numpy.nan
True
>>> None < float('-inf')

True
>>> None < 'Everything'
True

Notes:



  • In ArcGIS Pro (Python 3) you'll get a TypeError using a numeric comparison operator with None which will help avoid this issue.

  • This doesn't apply to shapefiles as the old dBase format .dbf that stores the attribute table doesn't support null values


In your expression, Python is returning True when evaluating the elif cond < 20 clause when cond is really None so never gets to the elif cond is None: clause.



So the following will work because it tests for None first:


def Cond_Score(cond):
if cond is None:
return 1
elif cond > 90:
return 1
elif cond >= 71 and cond <= 90:
return 2
elif cond >= 51 and cond <= 70:
return 3

elif cond >= 20 and cond <= 50:
return 4
elif cond < 20:
return 5

No comments:

Post a Comment

arcpy - Changing output name when exporting data driven pages to JPG?

Is there a way to save the output JPG, changing the output file name to the page name, instead of page number? I mean changing the script fo...