Как посчитать нулевые значения в таблице в строках и записать ее в новое поле?

9

Это очень простая задача, но я не могу понять правильный синтаксис.

У меня есть шейп-файл, атрибуты которого похожи на следующие:

FID Shape   FIELD1 FIELD2 FIELD3 ...
0   Polygon 0      1      0
1   Polygon 3      0      7
2   Polygon 3      4      7
...

Количество полей и их имена всегда разные.

Мне нужно создать новое поле (назовем его NUM) и посчитать количество нулей в каждой строке.

Пример вывода:

FID Shape   FIELD1 FIELD2 FIELD3 NUM
0   Polygon 0      1      0      2
1   Polygon 3      0      7      1
2   Polygon 3      4      7      0

Я знаю, как создать новое поле, однако мне неясно, что делать дальше.


Рабочий код:

#path is path to shape file
def a(path):
  fields = arcpy.ListFields(path,"FID_*") #FID_* is wildcard to select a fields name 
  arcpy.AddField_management(path, "NUM", "SHORT") #create a field with name NUM
  cursor= arcpy.UpdateCursor(path) 
  for row in cursor:
    count=0
    for field in fields: 
      a= row.getValue(field.name) #take a value 
      if a==0: #if value=0 then value=value+1
        count+=1
    row.setValue("NUM", count)
    cursor.updateRow(row)
  del row 
  del cursor

Спасибо, blah238 , теперь я могу есть питонов!

Vasiya
источник

Ответы:

8

Вот схема одного из способов сделать это. Я оставлю кодирование вам в качестве упражнения.

  1. Прочитайте параметры, которые вам нужны, например, ввод table
  2. Создайте fieldsпеременную, используя ListFields(), необязательно, передавая ожидаемый field_type, например, Long
  3. Добавьте новое поле, " NUM", к tableиспользованиюAddField()
  4. Создайте cursorпеременную используяUpdateCursor()
  5. Для каждого rowв cursor:
    • Инициализировать countпеременную
    • Для каждого fieldв fields:
      • Получить valueиз fieldиспользованияrow.getValue()
      • Если valueравно 0, увеличение countна 1
    • Установите значение добавленного поля для countиспользованияrow.setValue()
    • Звонок cursor.updateRow(), переходящий в текущийrow
  6. Удалить rowи cursorпеременные
blah238
источник
3

Чтобы сделать это, вы можете открыть UpdateCursor и выполнить каждую строку, используя код (не проверенный), как этот.

rows = arcpy.UpdateCursor(path)   # path is your shapefile
for row in rows:
  count = 0
  if row.field1 == 0:
    count = count + 1
  if row.field2 == 0:
    count = count + 1
  if row.field3 == 0:
    count = count + 1
  row.num = count

Если у вас есть от field1 до fieldN, то вам также нужно будет пройтись по полям и использовать row.getValue () и row.setValue () для работы с переменными, а не со встроенными именами полей.

ОБНОВИТЬ

Возможно, используйте мой Ответ как подсказку для выполнения упражнения @ blah238 :-)

PolyGeo
источник
2
Мне нравится более "Pythonic" выражение: count + = 1 вместо count = count + 1, но это только я.
Фезтер
бла238 мучает меня !!!
Вася
Я стремлюсь быть более «Pythonic», поэтому постараюсь вспомнить в следующий раз - что я и имел в виду в прошлый раз, когда увидел этот синтаксис - спасибо!
PolyGeo
@Vasiya сожалею об этом, но я уверен, что вы слышали пословицу "Дайте человеку рыбу, и он ест на один день, научите человека ловить рыбу, и он ест на всю жизнь" :)
blah238
@ blah238 Проблема в том, что я травоядный и не ем питонов !!! =)
Вася