Neue Spalte in DF einfügen als Berechnung

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

Hallo,
ich habe einen DataFrame der wie folgt aussieht (leider funktioniert das hier mit dem Bilder einfügen nicht, ich hoffe man kann es erkennen: Eigentlich ist nur wichtig dass es eine Spalte gibt die 'beta' heißt):

muL sdL mu A B w beta
79 142.283545 257.856675 53.778125 1 1 0.008738 0.006882
316 30.771996 66.595677 6.715000 2 2 0.001091 0.001062
485 6.656955 12.734483 1.452667 1 1 0.000236 0.000183
396 36.992691 897.387078 2.482787 3 2 0.000403 0.000282
167 1.812622 8.536685 0.370000 1 1 0.000060 0.000027

Ich möchte nun eine neue Spalte mit dem Namen Penalty einfügen. Der Wert is abhängig von dem Unterschied zwischen einem fixen Wert ("average") und dem Eintrag in der Spalte "beta" der jeweiligen Zeile im DF. Ich habe es folgendermaßen probiert:

Code: Alles auswählen

average = 0.95/153
betadf['penalty']=0
if (betadf['beta']-average) > 0:
    betadf['penalty']=0
else:
    betadf['penalty']=(betadf['beta']-average)
Ich bekomme den Fehler: "The truth value of a Series is ambiguous"

Weiß jemand voran das liegt?
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Nun ja, weil das so nicht geht :-)
So geht es:

Code: Alles auswählen

betadf['penalty'] = 0
betadf['penalty'].where(betadf['beta']-average <= 0, betadf['beta']-average, inplace=True)
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Lizzy
User
Beiträge: 48
Registriert: Mittwoch 30. Januar 2019, 15:22

Vielen Dank 😊
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Der Fehler sagt eigentlich genau, warum das nicht geht, weil mehrere Werte nicht größer als ein Zahl sein können: Ist jetzt 3 und -5 größer als 0 oder nicht?
Eigentlich willst Du clippen:

Code: Alles auswählen

betadf['penalty'] = (betadf['beta']-average).clip(upper=0)
Lizzy
User
Beiträge: 48
Registriert: Mittwoch 30. Januar 2019, 15:22

@Sirius3: Ich bekomme bei Deiner Methode die richtigen Werte, nur mit einem Minus davor. Was macht das clippen anders?
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Clipping macht genau das, was es sagt: alle Werte von (betadf['beta']-average), die größer als 0 sind auf 0 setzen. Damit bleiben nur negative Werte übrig. So habe ich Deine if-Abfrage auch gelesen.
Lizzy
User
Beiträge: 48
Registriert: Mittwoch 30. Januar 2019, 15:22

Achso, ja im Prinzip möchte ich genau das, nur soll der Unterschied als positiver Wert abgebildet werde
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Dann mußt Du halt die Formeln anpassen.
Lizzy
User
Beiträge: 48
Registriert: Mittwoch 30. Januar 2019, 15:22

Danke :)
Antworten