Conditional statement in For loop

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
st_baum
User
Beiträge: 26
Registriert: Sonntag 24. Mai 2020, 13:54

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

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?
st_baum
User
Beiträge: 26
Registriert: Sonntag 24. Mai 2020, 13:54

Sorry, dass ist mir entgangen. Den Datensatz importiere ich mit Pandas:

import pandas
data=pandas.read_csv('dummy.csv')
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
st_baum
User
Beiträge: 26
Registriert: Sonntag 24. Mai 2020, 13:54

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

@st_baum: In der Warnung ist doch der Link zur Dokumentation enthalten.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
st_baum
User
Beiträge: 26
Registriert: Sonntag 24. Mai 2020, 13:54

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.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

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

@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
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten