Могу ли я объединить несколько запросов итераторов Python для ArcGIS в один? - PullRequest
0 голосов
/ 23 октября 2019

Я до сих пор не работал с запросами к ArcMap для определения пустых полей, поэтому я работал с некоторым кодом, который нашел здесь, и подправил его для своих целей. Я пытаюсь просмотреть большую таблицу, поле за полем, чтобы увидеть, сколько нулевых значений существует из фактических значений (разбитых по каждому полю, а не по общей сумме). Я могу сделать это по одному полю за раз, но я подумал, что должен быть лучший способ объединить эти запросы в одно.

Проблема в том, что когда я пытаюсь сделать это с помощью приведенного ниже кода, я, очевидно, что-то пропустил, потому что скрипт ищет каждый раз, когда оба поля являются нулевыми, поэтому мои нулевые значения были отключены .. ..

Вот мой код, который работает так, как я хочу, чтобы поиск в поле с именем INTTYPE:

from __future__ import division
... count_nulls = 0
... total_records=0
... with arcpy.da.SearchCursor(r'C:\Users\Me\AppData\Roaming\ESRI\Desktop10.5\ArcCatalog\Transportation Connection.sde\gis_TRANS.TRANS.Pavement\gis_TRANS.TRANS.INVENTORY', 'INTTYPE') as cursor:
...     for i, row in enumerate(cursor):
...         null_fields = [name for name, value in
...                        zip(cursor.fields, row) if value is None]
...         if null_fields:
...             count_nulls += len(null_fields)
...             total_records += 1
...         else:
...             total_records += 1
... 
... print '{} total null inttype values'.format(count_nulls) 
... print '{} total records'.format(total_records)
... print 'percent is ',((count_nulls/total_records)*100)

Это результат, который я получаю (ожидается):

9187 total null inttype values
9229 total records
percent is  99.5449127749

Вот мой код, когда я изменил его и попытался просмотреть два поля (INTTYPE и INSTALLDATE) и получить проценты для обоих:

from __future__ import division
... count_nulls = 0
... total_records=0
... fc = r'C:\Users\Me\AppData\Roaming\ESRI\Desktop10.5\ArcCatalog\Transportation Connection.sde\gis_TRANS.TRANS.Pavement\gis_TRANS.TRANS.INVENTORY'
... field = 'INTTYPE', 'INSTALLDATE'
... with arcpy.da.SearchCursor(fc, field) as cursor:
...     for i, row in enumerate(cursor):
...         null_fields = [name for name, value in
...                        zip(cursor.fields, row) if value is None]
...         if null_fields:
...             count_nulls += len(null_fields)
...             total_records += len(null_fields)
...         else:
...             total_records += 1
... print '{} total null values'.format(count_nulls)             
... print '{} total records'.format(total_records)
... print 'percent is ',((count_nulls/total_records)*100)

В результате я получил:

18416 total null values
18416 total records
percent is  100.0

Итак, я вижу, что он не выполняет итерацию по каждому полю в отдельности, и поэтому, если он находит пустую запись в одном или обоих полях, total_records сбрасывается.

Я ожидаю, что результат будет:

18416 total null values 
18458 total records
percent is 99.7724563875

В идеале, если бы я был умнее в python, я бы получил результаты с разбивкой по полю, например:

9187 total null inttype values
9229 total records
percent is 99.5449127749

9229 total null installdate values
9229 total records
percent is 100.0

В конце концов, я пройду более 40 полей в таблице, поэтому я предпочел бы объединить это, если это возможно. У меня нет большого опыта работы с итерациями, поэтому будьте осторожны, ха-хаСпасибо!

...