Invalid syntax

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Lizzy
User
Beiträge: 48
Registriert: Mittwoch 30. Januar 2019, 15:22

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 :)
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

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)
Lizzy
User
Beiträge: 48
Registriert: Mittwoch 30. Januar 2019, 15:22

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

Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Der Fehler kommt von der Zeile davor. Da fehlt eine schließende Klammer. In den folgenden Zeilen übrigens auch.
In specifications, Murphy's Law supersedes Ohm's.
Lizzy
User
Beiträge: 48
Registriert: Mittwoch 30. Januar 2019, 15:22

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

__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

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
Lizzy
User
Beiträge: 48
Registriert: Mittwoch 30. Januar 2019, 15:22

Aber wie kann ich dann auf zB den Wert von w in der jeweiligen Zeile zugreifen?
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Lizzy
User
Beiträge: 48
Registriert: Mittwoch 30. Januar 2019, 15:22

@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
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten