Я до сих пор не работал с запросами к 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 полей в таблице, поэтому я предпочел бы объединить это, если это возможно. У меня нет большого опыта работы с итерациями, поэтому будьте осторожны, ха-хаСпасибо!