Take the 2-minute tour ×
Geographic Information Systems Stack Exchange is a question and answer site for cartographers, geographers and GIS professionals. It's 100% free, no registration required.

This is a very simple task to do but I can't understand the right syntax.

I have a shapefile whose attributes are similar to the following:

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

The number of fields and their names are always different.

I need to create a new field (let's name it NUM), and count the number of zeros in each row.

Example output:

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

I know how to create a new field, however I am not clear on the next steps.


The working code:

#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

Thanks blah238, now I can eat pythons!

share|improve this question

2 Answers 2

up vote 8 down vote accepted

Here's an outline of one way to do this. I'll leave the coding to you as an exercise.

  1. Read the parameter(s) you need, such as the input table
  2. Create a fields variable using ListFields(), optionally passing in the expected field_type, e.g. Long
  3. Add a new field, "NUM", to the table using AddField()
  4. Create a cursor variable using UpdateCursor()
  5. For each row in cursor:
    • Initalize a count variable
    • For each field in fields:
      • Get the value of field using row.getValue()
      • If value equals 0, increment count by 1
    • Set the value of the added field to count using row.setValue()
    • Call cursor.updateRow(), passing in the current row
  6. Delete the row and cursor variables
share|improve this answer

To do this you could open an UpdateCursor and run through each row using code (untested) like this.

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

If you have field1 to fieldN then you will need to also loop through the fields and use row.getValue() and row.setValue() to work with variable rather than hardwired field names.

UPDATE

Perhaps use my Answer as hints to complete @blah238's exercise :-)

share|improve this answer
2  
I like the more "Pythonic" expression of: count+=1 instead of count = count + 1 but that's just me. –  Fezter Oct 10 '12 at 5:41
    
blah238 is torturing me!!! –  Vasiya Oct 10 '12 at 5:52
    
I aspire to be more "Pythonic" so will try to remember for next time - which is what I intended last time I saw that syntax - thanks! –  PolyGeo Oct 10 '12 at 5:53
    
@Vasiya sorry about that, but I'm sure you've heard the proverb "Give a man a fish and he eats for a day, teach a man to fish and he eats for a lifetime" :) –  blah238 Oct 10 '12 at 5:56
    
@blah238 The problem is that i am herbivore and don't eat pythons!!! =) –  Vasiya Oct 10 '12 at 6:03

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.