Python If Function for Ranged Field
实际上,这是GIS中的一个python,所以我在arcgis中使用table,并尝试对字段进行计数,然后使用category对其进行划分。
我有一个叫Elevation的领域数据包含整数示例:1—23—62—38.5—1211—12
我需要使用以下规则对其进行分类:高程<1,则指数=0.3;如果高程=2-3,则指数=0.6;如果高程>3,则指数=1。
我有这个代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 | def Reclass( Elevation ): r_min, r_max = (float(s.strip()) for s in Elevation.split('-')) print"r_min: {0}, r_max: {1}".format(r_min,r_max) if r_min < 1 and r_max < 1: return 0.333 elif r_min >= 1 and r_max >= 1 and r_min <= 3 and r_max <= 3: return 0.666 elif r_min > 3 and r_max > 3: return 1 elif r_min <= 3 and r_max > 3: return 1 else: return 999 |
我的问题是如何剥离它,并使用我上面的规则对其进行分类?感谢之前
基于注释,您的字段是一个字符串,其中包含您上面描述的表单的范围。
首先,这是糟糕的数据库设计。最小值和最大值应该是整数类型的单独列。在ESRI上挥拳致意更多,因为它阻碍了良好的数据库设计。
此外,您的规则不足以处理范围。范围检查要么需要与范围的一端或两端进行比较。所以你必须明确你想要的"索引"规则是什么。
如果您有表示范围的字符串,那么您唯一的选择就是将范围解析为最小值和最大值,并使用这些字符串。这在Python中并不难:
1 2 3 4 5 6 | >>> r ="3 - 6" >>> r_min, r_max = (int(s.strip()) for s in r.split('-')) >>> r_min 3 >>> r_max 6 |
这是做什么的?
实际上,这很简单。它通过
请注意,格式错误的数据将导致错误。
一旦您阐明了"索引"规则,您就可以了解如何使用这个最小值和最大值来获得"索引"。
我从您和下面的@jpmc26借用了代码。这段代码(减去用于测试的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | def Reclass( Elevation ): r_min, r_max = (float(s.strip()) for s in Elevation.split('-')) print"r_min: {0}, r_max: {1}".format(r_min,r_max) if r_min < 1 and r_max < 1: return 0.333 elif r_min >= 1 and r_max >= 1 and r_min <= 3 and r_max <= 3: return 0.666 elif r_min > 3 and r_max > 3: return 1 else: return 999 print Reclass("0 - 1.1") print Reclass("5.2 - 10") print Reclass("2 - 3") print Reclass("0 - 0") |