Como contar valores zero em uma tabela em linhas e gravá-los no novo campo?

9

Essa é uma tarefa muito simples, mas não consigo entender a sintaxe correta.

Eu tenho um shapefile cujos atributos são semelhantes aos seguintes:

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

O número de campos e seus nomes são sempre diferentes.

Preciso criar um novo campo (vamos chamá-lo de NUM) e contar o número de zeros em cada linha.

Exemplo de saída:

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

Sei como criar um novo campo, mas não estou claro sobre as próximas etapas.


O código de trabalho:

#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

Obrigado blah238 , agora eu posso comer pitães!

Vasiya
fonte

Respostas:

8

Aqui está um esboço de uma maneira de fazer isso. Vou deixar a codificação para você como um exercício.

  1. Leia o (s) parâmetro (s) necessário (s), como a entrada table
  2. Crie uma fieldsvariável usando ListFields(), opcionalmente, passando o esperado field_type, por exemplo, Long
  3. Adicionar um novo campo, " NUM", ao tableusarAddField()
  4. Crie uma cursorvariável usandoUpdateCursor()
  5. Para cada rowem cursor:
    • Initalizar uma countvariável
    • Para cada fieldem fields:
      • Obter o valuede fieldusarrow.getValue()
      • Se for valueigual a 0, incremente countem 1
    • Defina o valor do campo adicionado para countusarrow.setValue()
    • Chamada cursor.updateRow(), passando na correnterow
  6. Exclua as variáveis rowecursor
blah238
fonte
3

Para fazer isso, você pode abrir um UpdateCursor e percorrer cada linha usando um código (não testado) como este.

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

Se você tiver o campo1 para o campoN, também precisará percorrer os campos e usar row.getValue () e row.setValue () para trabalhar com nomes de campos variáveis ​​em vez de com fio.

ATUALIZAR

Talvez use minha resposta como dicas para concluir o exercício de @ blah238 :-)

PolyGeo
fonte
2
Eu gosto da expressão mais "pitonica" de: count + = 1 em vez de count = count + 1, mas sou apenas eu.
Fezter
blah238 está me torturando !!!
10138 Vasiya
Aspiro a ser mais "pitonico", por isso tentarei me lembrar da próxima vez - que é o que pretendia da última vez que vi essa sintaxe - obrigado!
PolyGeo
@Vasiya sinto muito por isso, mas eu tenho certeza que você já ouviu o ditado "Dê a um homem um peixe e come por um dia, ensinar um homem a pescar e come para uma vida" :)
blah238
@ blah238 O problema é que eu sou herbívoro e não como pitões !!! =)
Vasiya 10/10