Calculate field Python If else

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,
Ik heb een modelbuilder procedure (ESRI) die wordt hergebruikt met twee afwijkende input tabellen.
De inputtabel wordt gejoined, waarna er een calculate field volgt.

Bijv.
BETR_PAKKETCODE = !GEWASCODE!

Echter bij gebruik van het 2e afwijkende join_table krijgt het veld GEWASCODE een _1 aangezien dit veld reeds voor kwam in de input_table

Hierdoor is de eenvoudige calculate field van hierboven niet te hergebruiken.

Nu is mijn vraag hoe kan ik in een elif python syntax het veld BETR_PAKKETCODE berekenen in een calculate field waarbij.
BETR_PAKKETCODE gevuld wordt met de waarde uit het veld GEWASCODE als dat veld bestaat.
Maar als het veld GEWASCODE_1 bestaat dan de waarde uit het veld GEWASCODE_1 gebruiken.


Is dat mogelijk?

Alle reacties


Acties:
  • 0 Henk 'm!

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 27-07 10:18
Je bedoelt een short-hand if-else notation?

Python:
1
2
3
foo = 42
bar = "X" if foo != 42 else "Y"
print bar # Y

Engineering is like Tetris. Succes disappears and errors accumulate.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hey Hallo bedankt voor je reactie.
Ik ben helemaal nieuw in python. Zou je het bovenstaande kunnen toelichten en eventueel de voorbeeld kolomnamen kunnen gebruiken. Anders vrees ik dat het niet goed gaat komen /0\

Acties:
  • +1 Henk 'm!

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 27-07 10:18
Nee, het is wel de bedoeling dat je er wat van leert. Op Tweakers gaan we het niet gewoon voorkauwen, want daar leer je niet zoveel van. Als ik je nu zomaar het antwoord geef blijf je helemaal nieuw in Pythin. Ik stel voor dat je die 3 regels eens in code gooit en kijkt wat er gebeurt als je e.e.a. veranderd. Het is niet zo lastig om te zien als je het letterlijk vertaald naar Nederlands
code:
1
2
3
foo is 42
bar is "X" als foo niet gelijk is aan 42, en anders is het Y
print bar

Engineering is like Tetris. Succes disappears and errors accumulate.


Acties:
  • 0 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 08:54
Ik heb het al vaker geroepen, maar als je snel online Python wilt leren:
https://www.codecademy.com/learn/python

Die korte, gestructureerde cursus werkt waarschijnlijk beter dan steeds losse vragen stellen. In ieder geval om de basale syntax te leren....

Maar goed, waarschijnlijk zit je in een Python node in modelbuilder, dus dat compliceert de boel wellicht wat. Ik neem aan dat er bepaalde variabelen worden aangeboden en dat je ook variabelen terug kunt geven aan modelbuilder?

Vraag is dan even hoe dat gebeurt en hoe je moet checken of de variabele bestaat en of ie een waarde heeft... Wordt de !GEWASCODE! normaal vervangen door een waarde? En wordt deze None als er geen waarde is?

BETR_PAKKETCODE = !GEWASCODE_1! or !GEWASCODE!

Werkt niet toevallig?

[ Voor 53% gewijzigd door Morrar op 31-01-2017 23:10 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo Morrar,

Bedankt voor deze goede tip. Ben al begonnen aan de codecademy. Ik zie van alles voorbij komen wat de richting in gaat van wat ik zoek. En ik kan het ook redelijk goed begrijpen. Maar de toepassing voor mijn issue is nog zoek.

Het is idd een moddelbuilder scherm die reeds een aantal parameter velden bevat.

Het probleem is dat het veld GEWASCODE en het veld GEWASCODE_1 beide in één tabel voorkomen.
Als dat het geval is dan dient de waarde uit het veld GEWASCODE_1 in het veld BETR_PAKKETCODE gerekend te worden.

Komt enkel het veld GEWASCODE in de tabel voor dan dient deze gebruikt te worden om BETR_PAKKETCODE te vullen.

Bestaat er een elif met een exist toepassing?

Acties:
  • 0 Henk 'm!

  • g0tanks
  • Registratie: Oktober 2008
  • Laatst online: 16:33

g0tanks

Moderator CSA
Verwijderd schreef op donderdag 2 februari 2017 @ 15:38:
Hallo Morrar,

Bedankt voor deze goede tip. Ben al begonnen aan de codecademy. Ik zie van alles voorbij komen wat de richting in gaat van wat ik zoek. En ik kan het ook redelijk goed begrijpen. Maar de toepassing voor mijn issue is nog zoek.

Het is idd een moddelbuilder scherm die reeds een aantal parameter velden bevat.

Het probleem is dat het veld GEWASCODE en het veld GEWASCODE_1 beide in één tabel voorkomen.
Als dat het geval is dan dient de waarde uit het veld GEWASCODE_1 in het veld BETR_PAKKETCODE gerekend te worden.

Komt enkel het veld GEWASCODE in de tabel voor dan dient deze gebruikt te worden om BETR_PAKKETCODE te vullen.

Bestaat er een elif met een exist toepassing?
Je zou een dubbele IF-statement kunnen gebruiken om te controleren of GEWASCODE_1 bestaat. Om maar het vorige voorbeeld te nemen, iets in de trant van:
code:
1
2
3
foo = 42
bar = "X" if (foo != 42 and bla == True) else "Y"
print bar # Y


Werk eerst die tutorial maar eens door en lees de documentatie van de verschillende basisfuncties zoals IF.

Ultrawide gaming setup: AMD Ryzen 7 2700X | NVIDIA GeForce RTX 2080 | Dell Alienware AW3418DW


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,
Ik heb nu onderstaande script, na het runnen krijg ik de melding "Script run OK"
Echter hij heeft in mijn werklijst niet het veld BETR_PAKKETCODE ge-update.

Wie kan mij verder helpen?


import arcpy

fc = r"E:\Data\User\Python_test\Werkbestanden.gdb\KI_ROC_werklijst"

fields = arcpy.ListFields(fc, 'BETR_PAKKETCODE')

for field in fields:
if field.name == 'GEWASCODE_1':
arcpy.CalculateField_management(fc, 'BETR_PAKKETCODE', 'GEWASCODE_1',"PYTHON_9.3")

elif field.name == 'GEWASCODE':

arcpy.CalculateField_management(fc, 'BETR_PAKKETCODE', 'GEWASCODE', "PYTHON_9.3")

else: 'oke'

Acties:
  • 0 Henk 'm!

  • g0tanks
  • Registratie: Oktober 2008
  • Laatst online: 16:33

g0tanks

Moderator CSA
Ziet er uit als een goed begin. Ik ben niet bekend met arcpy, maar het lijkt mis te gaan bij arcpy.CalculateField_management. Kijk eens naar de documentatie van deze functie: http://pro.arcgis.com/en/...ement/calculate-field.htm

Het derde argument moet van het type SQL Expression zijn. Dit lijkt dus niet de goede functie om GEWASCODE(_1) te kopiëren naar BETR_PAKKETCODE.

Ultrawide gaming setup: AMD Ryzen 7 2700X | NVIDIA GeForce RTX 2080 | Dell Alienware AW3418DW


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het is gelukt!
Deze week heb ik de "scripting with Pyton" cursus bij ESRI gevolgd. Bedankt voor jullie motivatie en support!


import arcpy

fc = r"C:\EsriTraining\PYTH\Case\Werkbestanden_1.gdb\KI_ROC_werklijst"

fields = arcpy.ListFields (fc)
print("Checking {} fields".format(len(fields)))
for field in fields:
print("Checking field: "+ field.name)
if field.name == 'GEWASCODE_1':
print("GEWASCODE_1 exists")
arcpy.CalculateField_management(fc, 'BETR_PAKKETCODE', '!GEWASCODE_1!',"PYTHON_9.3")

##Ik wil de waarde….uit het veld GEWASCODE_1 vullen en dan moet die tussen uitroeptekens

elif field.name == 'GEWASCODE':
print("GEWASCODE exists")
arcpy.CalculateField_management(fc, 'BETR_PAKKETCODE', '!GEWASCODE!', "PYTHON_9.3")

##Ik wil de waarde.... uit het veld GEWASCODE vullen en dan moet die tussen uitroeptekens


else:
print("else")
arcpy.CalculateField_management(fc, 'BETR_PAKKETCODE', '"Oke"', "PYTHON_9.3")

## else ik wil de waarde Oke vullen. Dan moet ik die waarde tussen extra Quotes zetten


print("Ready")

Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
Edit je spullen ff en plaats je code tussen code tags aub.

https://niels.nu

Pagina: 1