Seite 1 von 1
Conditional statement in For loop
Verfasst: Sonntag 24. Mai 2020, 14:03
von st_baum
Ich habe gerade erst mit Python angefangen und habe ein kleines Problem:
Ein Vektor ('d_a') in deinem Datensatz ('data') enthält für jedes Element den Wert "0". In Abhängigkeit eines anderen Wertes im Datensatz ('condition'), soll der Wert von 'd_a' auf "1" geändert werden. 'condition' enthält die Werte 'Yes' und 'No':
Code: Alles auswählen
for n in data['condition']:
if n == "Yes":
data['d_a'] = 1
Allerdings wird hier jedem Element in 'd_a' der Wert '1" zugewiesen. Ich vermute, es hängt an der Indexierung von 'd_a'. Wie mache ich es richtig? Die Abfrage der Bedingung ist in Ordnung
Re: Conditional statement in For loop
Verfasst: Sonntag 24. Mai 2020, 14:34
von __deets__
Du zeigst entscheidende Teile deines Codes nicht. Wir wissen also nicht, welchen Typ genau data hat. Ist das ein Pandas DataFrame, oder ein numpy-Array, oder eine normale Liste?
Re: Conditional statement in For loop
Verfasst: Sonntag 24. Mai 2020, 14:55
von st_baum
Sorry, dass ist mir entgangen. Den Datensatz importiere ich mit Pandas:
import pandas
data=pandas.read_csv('dummy.csv')
Re: Conditional statement in For loop
Verfasst: Sonntag 24. Mai 2020, 15:02
von __blackjack__
@st_baum: Dann ist die ``for``-Schleife der falsche Ansatz. Man benutzt Pandas ja gerade um keine ``for``-Schleifen schreiben zu müssen.
Ungetestet:
Code: Alles auswählen
data["d_a"] = data["condition"] == "Yes"
# oder
data["d_a"][data["condition"] == "Yes"] = 1
Re: Conditional statement in For loop
Verfasst: Sonntag 24. Mai 2020, 15:20
von st_baum
Zunächst besten Dank für die Rückmeldung.
Der erste Vorschlag erzeugt True bzw False für d_a, ich möchte den Elementen in 'd_a' allerdings explizit einen numerischen Wert zuweisen. Der zweite Vorschlag führt zu einem Fehler
C:\Users\***\anaconda3\lib\site-packages\ipykernel_launcher.py:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation:
https://pandas.pydata.org/pandas-docs/s ... sus-a-copy
"""Entry point for launching an IPython kernel.
Wie müsste ich den meinen o.a. Vorschlag anpassen, so dass ich zum Ziel komme?
Re: Conditional statement in For loop
Verfasst: Sonntag 24. Mai 2020, 16:08
von __blackjack__
@st_baum: In der Warnung ist doch der Link zur Dokumentation enthalten.
Re: Conditional statement in For loop
Verfasst: Sonntag 24. Mai 2020, 16:14
von st_baum
Es ist mir trotzdem noch nicht klar, wie ich in dem Loop im o.a. Vorschlag die Zeilte 'n' in 'd_a' richtig adressiere. Es muss doch möglich sein, die Zeile n im Loop zu adressieren. Ich frage so hartnäckig, da ich lernen will, weswegen meine Idee nicht funktioniert.
Re: Conditional statement in For loop
Verfasst: Sonntag 24. Mai 2020, 16:31
von sparrow
Deinen Vorschlag weiter zu verfolgen ist aber falsch.
Richtig ist, ein Werkzeug korrekt zu benutzen.
Natürich kannst du einen Nagel mit einer Bohrmaschine in die Wand kloppen. Ich würde einen Hammer nehmen.
Wenn du Pandas benutzt, dann benutze auch Pandas so, wie es gedacht ist.
Re: Conditional statement in For loop
Verfasst: Sonntag 24. Mai 2020, 16:55
von __blackjack__
@st_baum: Wenn es okay ist das in "d_a" der Wert 0 gesetzt wird wenn "condition" dort nicht "Yes" enthält, dann kannst Du die `bool`-Datenreihe einfach in einen Zahltyp umwandeln:
Code: Alles auswählen
data["d_a"] = (data["condition"] == "Yes").astype(int)
Um die Warnung bei meinem zweiten Beispiel zu umgehen darf man den Indexzugriff nicht verketten, sondern muss, wie in der in der Warnung verlinkten Dokumentation, über `loc` gehen und die Zeilen der Datenreihe in *einem* Indexzugriff erfassen um dann direkt einen Wert zuweisen zu können:
Code: Alles auswählen
In [246]: data
Out[246]:
condition d_a
0 Yes 0
1 No 0
2 Yes 1
3 No 1
In [247]: data.loc[data["condition"] == "Yes", "d_a"] = 1
In [248]: data
Out[248]:
condition d_a
0 Yes 1
1 No 0
2 Yes 1
3 No 1