Seite 1 von 1
Invalid syntax
Verfasst: Donnerstag 31. Januar 2019, 13:45
von Lizzy
Hi,
ich habe folgende if / elif Implementierung:
Code: Alles auswählen
Input = pd.read_excel(r'/Users/lisa/Documents/Uni/Masterarbeit /ML/Boostet/Input.xlsx')
df2 = DataFrame(Input,columns=['i', 'muL', 'sdL', 'w','class', 'prediction'])
df2.head()
Code: Alles auswählen
beta = 0
for row in df2.iterrows():
if row['prediction'] == 2:
beta = beta + (row['w']*(1-row['sdL']*0.0124/row['muL'])
elif row['prediction'] == 1:
beta = beta + (row['w']*(1-row['sdL']*0.1172/row['muL'])
else:
beta = beta + (row['w']*(1-row['sdL']*0.003/row['muL'])
print beta
Und bekomme immer den Fehler invalid Syntax (für elif). Weiß jemand was hier falsch ist?
Danke

Re: Invalid syntax
Verfasst: Donnerstag 31. Januar 2019, 13:57
von __deets__
Bitte den gesamten Stacktrace zeigen. So sieht das naemlich korrekt aus, auch wenn du eine Unsauberkeit im else-clause hast - die Einrueckung ist nicht 4 Spaces.
Code: Alles auswählen
beta = 0
row = dict(prediction=2)
for row in [row]:
if row['prediction'] == 2:
beta = beta + 1
elif row['prediction'] == 1:
beta = beta + 2
else:
beta = beta + 3
print(beta)
Re: Invalid syntax
Verfasst: Donnerstag 31. Januar 2019, 14:08
von Lizzy
Danke für die Antwort. Was macht bei deinem Code das dict(predicition=2)?
Und was fehlt bei meinem Code? Ich habe eigentlich alles angegeben
Das ist die Fehlermeldung
Code: Alles auswählen
File "<ipython-input-41-9bc064f883d9>", line 5
elif row['prediction'] == 1:
^
SyntaxError: invalid syntax
Re: Invalid syntax
Verfasst: Donnerstag 31. Januar 2019, 14:12
von pillmuncher
Der Fehler kommt von der Zeile davor. Da fehlt eine schließende Klammer. In den folgenden Zeilen übrigens auch.
Re: Invalid syntax
Verfasst: Donnerstag 31. Januar 2019, 14:16
von Lizzy
Danke, die Klammern hab ich korrigiert.
Nun folgende Fehlermeldung:
Code: Alles auswählen
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-43-472ff704b29d> in <module>
1 beta = 0
2 for row in df2.iterrows():
----> 3 if row['prediction'] == 2:
4 beta = beta + (row['w']*(1-row['sdL']*0.0124/row['muL']))
5 elif row['prediction'] == 1:
TypeError: tuple indices must be integers or slices, not str
Re: Invalid syntax
Verfasst: Donnerstag 31. Januar 2019, 14:21
von __deets__
Das Objekt das du in row hast ist nicht was du denkst das es ist. Du tust so als ob es ein mapping/dictionary/Woerterbuch waere, mit Strings als Schluesseln. Es ist aber ein Tupel, also mit Stellen/Nummerbasiertem Zugriff. Warum dem so ist kannst du der Pandas-Dokumentation zur Methode iterrows entnehmen.
https://pandas.pydata.org/pandas-docs/s ... rrows.html
Re: Invalid syntax
Verfasst: Donnerstag 31. Januar 2019, 14:28
von Lizzy
Aber wie kann ich dann auf zB den Wert von w in der jeweiligen Zeile zugreifen?
Re: Invalid syntax
Verfasst: Donnerstag 31. Januar 2019, 14:32
von __deets__
Das ist in der Dokumentation recht genau beschrieben, Beispiel inklusive.
"Iterate over DataFrame rows as (index, Series) pairs."
Und
row = next(df.iterrows())[1]
Der Sinn der [1] besteht darin, auf den zweiten Wert, die eigentliche Serie von Daten, zuzugreifen.
Re: Invalid syntax
Verfasst: Donnerstag 31. Januar 2019, 14:49
von __blackjack__
@Lizzy: Wobei das alles ”falsch” aussieht — wenn da Pandas verwendet wird, warum wird dann nicht Pandas auch tatsächlich verwendet? Das benutzt man ja gerade damit man *keine* ``for``-Schleifen über die Zeilen schreiben muss.
Re: Invalid syntax
Verfasst: Donnerstag 31. Januar 2019, 14:55
von Lizzy
@blackjack: Ehrlich gesagt kenn ich mich mit Python / Pandas nicht wirklich aus, wenn das irgendwie mit Pandas geht dann gerne, ich weiß nur nicht wie
Re: Invalid syntax
Verfasst: Donnerstag 31. Januar 2019, 15:38
von __blackjack__
Man braucht doch nur aus dem 'prediction'-Series-Objekt zum Beispiel mittels `map()`-Methode und einer kleinen Funktion, ein `Series`-Objekt mit den Faktoren erstellen und schon sollte man einfach mit den Series-Objekten rechnen können.