Làm thế nào để đếm các giá trị 0 trong một bảng trong các hàng và ghi nó vào trường mới?


9

Đây là một nhiệm vụ rất đơn giản để làm nhưng tôi không thể hiểu đúng cú pháp.

Tôi có một shapefile có thuộc tính tương tự như sau:

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

Số lượng các lĩnh vựctên của họ luôn luôn khác nhau.

Tôi cần tạo một trường mới (đặt tên là NUM) và đếm số không trong mỗi hàng.

Ví dụ đầu ra:

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

Tôi biết cách tạo một lĩnh vực mới, tuy nhiên tôi không rõ ràng về các bước tiếp theo.


Mã làm việc:

#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

Cảm ơn blah238 , bây giờ tôi có thể ăn trăn!

Câu trả lời:


8

Đây là một phác thảo của một cách để làm điều này. Tôi sẽ để lại mã hóa cho bạn như một bài tập.

  1. Đọc (các) tham số bạn cần, chẳng hạn như đầu vào table
  2. Tạo một fieldsbiến bằng cách sử dụng ListFields(), tùy ý chuyển trong dự kiến field_type, ví dụ: Long
  3. Thêm một trường mới, " NUM", vào việc tablesử dụngAddField()
  4. Tạo một cursorbiến bằng cách sử dụngUpdateCursor()
  5. Đối với mỗi rowtrong cursor:
    • Vô hiệu hóa một countbiến
    • Đối với mỗi fieldtrong fields:
      • Lấy valuecác fieldsử dụngrow.getValue()
      • Nếu valuebằng 0, tăng count1
    • Đặt giá trị của trường được thêm vào để countsử dụngrow.setValue()
    • Gọi cursor.updateRow(), chuyển trong hiện tạirow
  6. Xóa rowcursorcác biến

3

Để làm điều này, bạn có thể mở UpdateCthon và chạy qua từng hàng bằng cách sử dụng mã (chưa được kiểm tra) như thế này.

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

Nếu bạn có trường1 đến trườngN thì bạn cũng cần phải lặp qua các trường và sử dụng row.getValue ()row.setValue () để làm việc với các tên trường thay vì tên cứng.

CẬP NHẬT

Có lẽ sử dụng Câu trả lời của tôi làm gợi ý để hoàn thành bài tập của @ blah238 :-)


2
Tôi thích biểu thức "Pythonic" hơn của: Count + = 1 thay vì Count = Count + 1 nhưng đó chỉ là tôi.
Fezter

blah238 đang hành hạ tôi !!!
Vasiya

Tôi khao khát trở thành "Pythonic" hơn vì vậy sẽ cố gắng ghi nhớ cho lần tới - đó là những gì tôi dự định lần trước tôi đã thấy cú pháp đó - cảm ơn!
PolyGeo

@Vasiya xin lỗi về điều đó, nhưng tôi chắc rằng bạn đã nghe câu tục ngữ "Hãy cho một người một con cá và anh ta ăn một ngày, dạy một người đàn ông câu cá và anh ta ăn cả đời" :)
blah238

@ blah238 Vấn đề là tôi là động vật ăn cỏ và không ăn trăn !!! =)
Vasiya
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.