Як порахувати нульові значення у таблиці рядками та записати їх у нове поле?


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 , тепер я можу їсти пітони!

Відповіді:


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змінні

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

Якщо у вас є поле1 до поляN, вам також потрібно буде провести цикл через поля та використовувати row.getValue () та row.setValue () для роботи зі змінними, а не з провідними іменами полів.

ОНОВЛЕННЯ

Можливо, використовуйте мій відповідь як підказки, щоб виконати вправу @ blah238 :-)


2
Мені подобається більше "пітонічний" вираз: count + = 1 замість count = count + 1, але це тільки я.
Фестер

blah238 мучить мене !!!
Васія

Я прагну бути більш "пітонічним", тому спробую запам’ятати наступний раз - про що я мав намір останній раз, коли побачив цей синтаксис - спасибі!
PolyGeo

@Vasiya вибачте з цього приводу, але я впевнений, що ви почули прислів’я "Дай людині рибу, і він їсть за день, навчи чоловіка ловити рибу, і він їсть все життя" :)
blah238

@ blah238 Проблема в тому, що я травоїдна і не їжу пітонів !!! =)
Васія
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.