테이블에서 0 값을 행으로 세어 새 필드에 쓰는 방법은 무엇입니까?


9

이것은 매우 간단한 작업이지만 올바른 구문을 이해할 수 없습니다.

속성이 다음과 비슷한 shapefile이 있습니다.

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

필드 와 그 이름은 항상 다릅니다.

새 필드를 작성하고 (이름은 NUM) 각 행에서 0의 수를 세어야합니다.

출력 예 :

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사용하여 변수를 작성하십시오 ( 예 : Long을ListFields() 선택적으로 전달).field_type
  3. "새 필드를 추가 NUM받는 사람," table사용AddField()
  4. 다음을 cursor사용하여 변수를 만듭니다.UpdateCursor()
  5. 각각 row에 대해 cursor:
    • count변수를 초기화
    • 각각 field에 대해 fields:
      • 가져 오기 valuefield사용을row.getValue()
      • 경우 value0, 증가 같습니다 count1 일까지를
    • 추가 된 필드의 값을 count사용으로 설정row.setValue()
    • cursor.updateRow()현재를 전달하는 전화row
  6. rowcursor변수 삭제

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에서 fieldN이있는 경우 필드를 반복 하고 행으로 연결된 필드 이름이 아닌 변수로 작업 하려면 row.getValue ()row.setValue ()사용해야 합니다.

최신 정보

아마도 내 대답을 힌트로 사용하여 @ blah238의 운동을 완료하십시오 :-)


2
나는 count = count + 1 대신에 count + = 1의 "Pythonic"표현을 더 좋아하지만 그건 나 뿐이다.
Fezter

blah238이 나를 고문하고 있습니다 !!!
Vasiya

나는 더 많은 "Pythonic"이되기를 열망하므로 다음에 기억하려고 노력할 것입니다. 이것이 제가 그 구문을 본 마지막 시간입니다-감사합니다!
PolyGeo

@Vasiya 그것에 대해 유감이지만, 당신이 속담을 들었다고 확신합니다. "남자에게 물고기를 주면 그는 하루를 먹고 물고기를 가르치고 평생을 먹는다":)
blah238

@ blah238 문제는 내가 초식 동물이고 파이썬을 먹지 않는다는 것입니다 !!! =)
Vasiya
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.