Ausgabe
Angenommen, ich habe die folgende DF
import pandas as pd
data_dic = {
"a": [0,0,1,2],
"b": [0,3,4,5],
"c": [6,7,8,9]
}
df = pd.DataFrame(data_dic)
Ich möchte mehrere logische Bedingungen setzen und eine neue Spalte „d“ erstellen, indem ich den Befehl „if else“ Lambda und „.assign “ verwende. Ich habe mehrere Formulare ausprobiert, kann aber kein Ergebnis erzielen (immer boolesche Fehler oder andere Probleme). Kann mir jemand die richtige Richtung oder die richtige Verwendung ähnlicher Befehle zeigen?
so etwas (unterstützt??)
(df
.assign(d = lambda x: (x['a']+x['b']) if ((x['a']==0) & (x['b']>0) & (x['c']==7)) else 0 )
)
Fehler:
ValueError: Der Wahrheitswert einer Serie ist mehrdeutig. Verwenden Sie a.empty, a.bool(), a.item(), a.any() oder a.all().
erwartetes Ergebnis:
out:
a b c d
0 0 0 6 0
1 0 3 7 3
2 1 4 8 0
3 2 5 9 0
vielen Dank für Anregungen,
erwartete Befehle in allgemeiner Form:
.assign(new_col = lambda x: (if True numeric sum col_a+col_b) if (logical conditions using col_a,b,c) else (default result))
Ich habe mehrere Formen mit boolean (bool()) ausprobiert, bin mir aber nicht sicher, was die richtige Syntax ist oder ob dies der richtige Ansatz ist.
Lösung
Zwei Dinge
- Lambda auf einen df anwenden . Sie müssen Lambda dem DF zuordnen. daher df.apply(…)
- Um es auf die Zeile anzuwenden, übergeben Sie das Argument axis=1
(df
.assign(d = df.apply(lambda x: (x['a']+x['b']) if ((x['a']==0) & (x['b']>0) & (x['c']==7)) else 0, axis=1) )
)
a b c d
0 0 0 6 0
1 0 3 7 3
2 1 4 8 0
3 2 5 9 0
abwechselnd,
Sie müssen nicht die Zuweisung verwenden. Weisen Sie das Ergebnis einfach der neuen Spalte zu
df['e'] = (df.apply(lambda x: (x['a']+x['b'])
if ((x['a']==0) & (x['b']>0) & (x['c']==7))
else 0
, axis=1) )
a b c d
0 0 0 6 0
1 0 3 7 3
2 1 4 8 0
3 2 5 9 0
Beantwortet von – Naveed
Antwort geprüft von – Clifford M. (FixError Volunteer)