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 etwas wie eine if
-Anweisung in Pandas verwenden.
if df['one'] >= df['two'] and df['one'] <= df['three']:
df['que'] = df['one']
Überprüfen Sie grundsätzlich jede Zeile mit der if
-Anweisung. Erstellen Sie eine neue Spalte.
Die Dokumente sagen .all
, aber es gibt kein Beispiel ...
Sie könnten np.where verwenden. Wenn cond
ein boolesches Array ist und A
und B
Arrays sind, dann
C = np.where(cond, A, B)
definiert, dass C gleich A
ist, wobei cond
True ist, und B
, wobei cond
False ist.
import numpy as np
import pandas as pd
a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])
df['que'] = np.where((df['one'] >= df['two']) & (df['one'] <= df['three'])
, df['one'], np.nan)
erträge
one two three que
0 10 1.2 4.2 10
1 15 70 0.03 NaN
2 8 5 0 NaN
Wenn Sie mehr als eine Bedingung haben, können Sie stattdessen np.select verwenden Wenn Sie beispielsweise möchten, dass df['que']
gleich df['two']
ist, wenn df['one'] < df['two']
, dann
conditions = [
(df['one'] >= df['two']) & (df['one'] <= df['three']),
df['one'] < df['two']]
choices = [df['one'], df['two']]
df['que'] = np.select(conditions, choices, default=np.nan)
erträge
one two three que
0 10 1.2 4.2 10
1 15 70 0.03 70
2 8 5 0 NaN
Wenn wir davon ausgehen können, dass df['one'] >= df['two']
wenn df['one'] < df['two']
False ist, könnten die Bedingungen und Auswahlmöglichkeiten vereinfacht werden
conditions = [
df['one'] < df['two'],
df['one'] <= df['three']]
choices = [df['two'], df['one']]
(Die Annahme trifft möglicherweise nicht zu, wenn df['one']
oder df['two']
NaNs enthalten.)
Beachten Sie, dass
a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])
definiert einen DataFrame mit Zeichenfolgewerten. Da sie numerisch aussehen, können Sie diese Zeichenfolgen besser in Floats konvertieren:
df2 = df.astype(float)
Dies ändert jedoch die Ergebnisse, da Zeichenfolgen Zeichen für Zeichen vergleichen, während Fließkommas numerisch verglichen werden.
In [61]: '10' <= '4.2'
Out[61]: True
In [62]: 10 <= 4.2
Out[62]: False
Sie können .equals
für Spalten oder ganze Datenrahmen verwenden.
df['col1'].equals(df['col2'])
Wenn sie gleich sind, gibt diese Anweisung True
zurück, andernfalls False
.
Sie könnten apply () verwenden und so etwas tun
df['que'] = df.apply(lambda x : x['one'] if x['one'] >= x['two'] and x['one'] <= x['three'] else "", axis=1)
oder wenn Sie es vorziehen, kein Lambda zu verwenden
def que(x):
if x['one'] >= x['two'] and x['one'] <= x['three']:
return x['one']
else:
''
df['que'] = df.apply(que, axis=1)
Eine Möglichkeit besteht darin, eine Boolesche Reihe zum Indizieren der Spalte df['one']
zu verwenden. Dadurch erhalten Sie eine neue Spalte, in der die True
-Einträge denselben Wert wie in derselben Zeile wie df['one']
haben und die False
-Werte NaN
sind.
Die boolesche Serie wird nur durch Ihre if
-Anweisung angegeben (obwohl &
anstelle von and
verwendet werden muss):
>>> df['que'] = df['one'][(df['one'] >= df['two']) & (df['one'] <= df['three'])]
>>> df
one two three que
0 10 1.2 4.2 10
1 15 70 0.03 NaN
2 8 5 0 NaN
Wenn Sie möchten, dass die NaN
-Werte durch andere Werte ersetzt werden, können Sie die fillna
-Methode für die neue Spalte que
verwenden. Ich habe hier 0
anstelle der leeren Zeichenfolge verwendet:
>>> df['que'] = df['que'].fillna(0)
>>> df
one two three que
0 10 1.2 4.2 10
1 15 70 0.03 0
2 8 5 0 0
Wickeln Sie jede einzelne Bedingung in Klammern ein und kombinieren Sie die Bedingungen mit dem &
-Operator:
df.loc[(df['one'] >= df['two']) & (df['one'] <= df['three']), 'que'] = df['one']
Sie können die nicht übereinstimmenden Zeilen füllen, indem Sie mit ~
(dem Operator "nicht") die Übereinstimmung invertieren:
df.loc[~ ((df['one'] >= df['two']) & (df['one'] <= df['three'])), 'que'] = ''
Sie müssen &
und ~
anstelle von and
und not
verwenden, da die &
- und ~
-Operatoren Element für Element arbeiten.
Das Endergebnis:
df
Out[8]:
one two three que
0 10 1.2 4.2 10
1 15 70 0.03
2 8 5 0
Verwenden np.select
Wenn Sie mehrere Bedingungen haben, die vom Datenrahmen geprüft werden sollen, und eine bestimmte Auswahl in einer anderen Spalte ausgeben möchten
conditions=[(condition1),(condition2)]
choices=["choice1","chocie2"]
df["new column"]=np.select=(condtion,choice,default=)
Hinweis: Es sollten keine Bedingungen und keine Auswahl übereinstimmen. Wiederholen Sie den ausgewählten Text, wenn Sie für zwei verschiedene Bedingungen die gleiche Auswahl haben
Ich denke, der Intuition des OP am nächsten kommt eine Inline-if-Anweisung:
df['que'] = (df['one'] if ((df['one'] >= df['two']) and (df['one'] <= df['three']))