Verwenden Sie dies als Ausgangspunkt:
a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])
Out[8]:
one two three
0 10 1.2 4.2
1 15 70 0.03
2 8 5 0
Ich möchte so etwas wie eine if
Aussage innerhalb von Pandas verwenden.
if df['one'] >= df['two'] and df['one'] <= df['three']:
df['que'] = df['one']
Überprüfen Sie grundsätzlich jede Zeile über die if
Anweisung und erstellen Sie eine neue Spalte.
Die Dokumente sagen zu verwenden, .all
aber es gibt kein Beispiel ...
python
pandas
if-statement
dataframe
Merlin
quelle
quelle
if
Aussage istFalse
?object
. Dies ermöglicht das Speichern beliebiger Python-Objekte in der Spalte, geht jedoch zu Lasten einer langsameren numerischen Berechnung. Wenn in der Spalte numerische Daten gespeichert sind, ist die Verwendung von NaNs für Nicht-Zahlen vorzuziehen.a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
. Dies führt zu verwirrenden Ergebnissen mit "korrektem" Code:df['que'] = df['one'][(df['one'] >= df['two']) & (df['one'] <= df['three'])]
ergibt10
für die erste Zeile, während es ergeben sollte,NaN
wenn die Eingabe ganze Zahlen gewesen wäre.Antworten:
Sie könnten np.where verwenden . Wenn
cond
es sich um ein boolesches Array handelt undA
undB
Arrays sind, danndefiniert C als gleich
A
wocond
ist wahr undB
wocond
ist falsch.ergibt
Wenn Sie mehr als eine Bedingung haben, können Sie stattdessen np.select verwenden. Wenn Sie beispielsweise
df['que']
gleichdf['two']
wann möchtendf['one'] < df['two']
, dannergibt
Wenn wir davon ausgehen können, dass
df['one'] >= df['two']
wenndf['one'] < df['two']
Falsch ist, könnten die Bedingungen und Auswahlmöglichkeiten vereinfacht werden(Die Annahme ist möglicherweise nicht wahr, wenn sie NaNs enthält
df['one']
oderdf['two']
enthält.)Beachten Sie, dass
Definiert einen DataFrame mit Zeichenfolgenwerten. Da sie numerisch aussehen, ist es möglicherweise besser, diese Zeichenfolgen in Floats umzuwandeln:
Dies ändert jedoch die Ergebnisse, da Zeichenfolgen zeichenweise verglichen werden, während Gleitkommazahlen numerisch verglichen werden.
quelle
Sie können
.equals
für Spalten oder ganze Datenrahmen verwenden.Wenn sie gleich sind, kehrt diese Aussage
True
, sonstFalse
.quelle
Sie könnten apply () verwenden und so etwas tun
oder wenn Sie kein Lambda verwenden möchten
quelle
Eine Möglichkeit besteht darin, eine Boolesche Reihe zum Indizieren der Spalte zu verwenden
df['one']
. Dies gibt Ihnen eine neue Spalte, in der dieTrue
Einträge den gleichen Wert wie die gleiche Zeile habendf['one']
und dieFalse
Werte sindNaN
.Die Boolesche Reihe wird nur durch Ihre
if
Aussage angegeben (obwohl es notwendig ist,&
statt zu verwendenand
):Wenn Sie möchten, dass die
NaN
Werte durch andere Werte ersetzt werden, können Sie diefillna
Methode für die neue Spalte verwendenque
. Ich habe hier0
anstelle der leeren Zeichenfolge verwendet:quelle
Schließen Sie jede einzelne Bedingung in Klammern ein und
&
kombinieren Sie die Bedingungen mit dem Operator:Sie können die nicht übereinstimmenden Zeilen füllen, indem Sie einfach
~
(den Operator "nicht") verwenden, um die Übereinstimmung zu invertieren:Sie müssen
&
und~
anstelle vonand
und verwenden,not
da die Operatoren&
und~
Element für Element arbeiten.Das Endergebnis:
quelle
Verwenden
np.select
Sie diese Option, wenn Sie mehrere Bedingungen aus dem Datenrahmen überprüfen und eine bestimmte Auswahl in einer anderen Spalte ausgeben möchtenHinweis: Die Anzahl der Bedingungen und die Anzahl der Auswahlmöglichkeiten sollten übereinstimmen. Wiederholen Sie den Text in der Auswahl, wenn Sie für zwei verschiedene Bedingungen die gleichen Auswahlmöglichkeiten haben
quelle
Ich denke, die Intuition des OP kommt einer Inline-if-Aussage am nächsten:
quelle
df['que'] = (df['one'] if ((df['one'] >= df['two']) and (df['one'] <= df['three'])) ^ SyntaxError: unexpected EOF while parsing