วิธีนับค่าเป็นศูนย์ในตารางในแถวและเขียนไปยังเขตข้อมูลใหม่?


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เช่นยาว
  3. เพิ่มเขตข้อมูลใหม่ " NUM" เพื่อการtableใช้งานAddField()
  4. สร้างcursorตัวแปรโดยใช้UpdateCursor()
  5. สำหรับแต่ละrowในcursor:
    • ทำให้ค่าเริ่มต้นเป็นcountตัวแปร
    • สำหรับแต่ละfieldในfields:
      • รับvalueของfieldใช้row.getValue()
      • ถ้าvalueเท่ากับ 0 ให้เพิ่มขึ้นcount1
    • ตั้งค่าของฟิลด์ที่เพิ่มเป็น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

หากคุณมี field1 to fieldN คุณจะต้องวนลูปผ่านฟิลด์ต่างๆและใช้row.getValue ()และrow.setValue ()เพื่อทำงานกับตัวแปรแทนที่จะใช้ชื่อฟิลด์ที่ใช้ฮาร์ดเวิร์

UPDATE

อาจใช้คำตอบของฉันเป็นคำแนะนำเพื่อให้การออกกำลังกายของ @ blah238 :-)


2
ฉันชอบนิพจน์ "Pythonic" มากกว่า: count + = 1 แทน count = count + 1 แต่นั่นเป็นเพียงฉัน
Fezter

blah238 กำลังทรมานฉัน !!!
Vasiya

ฉันปรารถนาที่จะเป็น "Pythonic" มากกว่านี้ดังนั้นจะพยายามจดจำในครั้งต่อไป - ซึ่งเป็นสิ่งที่ฉันตั้งใจครั้งสุดท้ายที่ฉันเห็นไวยากรณ์นั้น - ขอบคุณ!
PolyGeo

@ Vasiya ขอโทษด้วย แต่ฉันแน่ใจว่าคุณเคยได้ยินสุภาษิต "ให้ปลาแก่ผู้ชายและเขากินวันละสอนผู้ชายให้จับปลาและเขากินไปตลอดชีวิต" :)
blah238

@ blah238 ปัญหาคือฉันเป็นสัตว์กินพืชและไม่กินงูใหญ่ !!! =)
Vasiya
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.