Wenn Sie nur zwei Möglichkeiten zur Auswahl haben:
df['color'] = np.where(df['Set']=='Z', 'green', 'red')
Zum Beispiel,
import pandas as pd
import numpy as np
df = pd.DataFrame({'Type':list('ABBC'), 'Set':list('ZZXY')})
df['color'] = np.where(df['Set']=='Z', 'green', 'red')
print(df)
ergibt
Set Type color
0 Z A green
1 Z B green
2 X B red
3 Y C red
Wenn Sie mehr als zwei Bedingungen haben, verwenden Sie np.select
. Zum Beispiel, wenn Sie wollen , color
sein
yellow
wann (df['Set'] == 'Z') & (df['Type'] == 'A')
- Andernfalls
blue
wenn(df['Set'] == 'Z') & (df['Type'] == 'B')
- Andernfalls
purple
wenn(df['Type'] == 'B')
- Andernfalls
black
,
dann benutze
df = pd.DataFrame({'Type':list('ABBC'), 'Set':list('ZZXY')})
conditions = [
(df['Set'] == 'Z') & (df['Type'] == 'A'),
(df['Set'] == 'Z') & (df['Type'] == 'B'),
(df['Type'] == 'B')]
choices = ['yellow', 'blue', 'purple']
df['color'] = np.select(conditions, choices, default='black')
print(df)
was ergibt
Set Type color
0 Z A yellow
1 Z B blue
2 X B purple
3 Y C black
df['foo'] = np.where(df['Set']=='Z', df['Set'], df['Type'].shift(1))
Das Listenverständnis ist eine weitere Möglichkeit, eine weitere Spalte bedingt zu erstellen. Wenn Sie wie in Ihrem Beispiel mit Objekt-dtypes in Spalten arbeiten, übertreffen Listenverständnisse normalerweise die meisten anderen Methoden.
Beispiel Listenverständnis:
% timeit Tests:
quelle
pd.DataFrame({'Type':list('ABBC')*100000, 'Set':list('ZZXY')*100000})
size) dienumpy.where
Outpaces überschritten werdenmap
, das Listenverständnis jedoch von entscheidender Bedeutung ist (ca. 50% schneller alsnumpy.where
).df['color'] = ['red' if (x['Set'] == 'Z') & (x['Type'] == 'B') else 'green' for x in df]
df['color_type'] = np.where(df['Set']=='Z', 'green', df['Type'])
.iterrows()
notorisch träge ist und der DataFrame während der Iteration nicht geändert werden sollte.Ein anderer Weg, wie dies erreicht werden könnte, ist
quelle
Hier ist noch eine andere Möglichkeit, diese Katze zu häuten, indem Sie mithilfe eines Wörterbuchs neue Werte auf die Schlüssel in der Liste abbilden:
Wie sieht es aus:
Dieser Ansatz kann sehr leistungsfähig sein, wenn Sie viele haben
ifelse
Anweisungen vom Typ geben müssen (dh viele eindeutige Werte, die ersetzt werden müssen).Und das können Sie natürlich immer tun:
Dieser Ansatz ist jedoch mehr als dreimal so langsam wie der
apply
auf meinem Computer Ansatz von oben.Und Sie können dies auch tun, indem Sie
dict.get
:quelle
.map()
Lösung ~ 10-mal schneller als.apply()
..apply()
dauert 52 Zeichenfolgenwerte 47 Sekunden, gegenüber nur 5,91 Sekunden.map()
.Das Folgende ist langsamer als die hier zeitgesteuerten Ansätze , aber wir können die zusätzliche Spalte basierend auf dem Inhalt von mehr als einer Spalte berechnen, und es können mehr als zwei Werte für die zusätzliche Spalte berechnet werden.
Einfaches Beispiel mit nur der Spalte "Set":
Beispiel mit mehr Farben und mehr Spalten berücksichtigt:
Bearbeiten (21/06/2019): Verwenden von Plydata
Es ist auch möglich, Plydata zu verwenden, um diese Art von Dingen auszuführen (dies scheint jedoch noch langsamer zu sein als die Verwendung von
assign
undapply
).Einfach
if_else
:Verschachtelt
if_else
:quelle
Vielleicht war dies mit neueren Updates von Pandas möglich, aber ich denke, das Folgende ist die kürzeste und vielleicht beste Antwort auf die Frage, die es bisher gab. Du kannst den ... benutzen
.loc
Methode verwenden und je nach Bedarf eine oder mehrere Bedingungen verwenden.Code-Zusammenfassung:
Erläuterung:
Fügen Sie eine 'Farb'-Spalte hinzu und setzen Sie alle Werte auf "rot".
Wenden Sie Ihre einzige Bedingung an:
oder mehrere Bedingungen, wenn Sie möchten:
Sie können die logischen Operatoren und die bedingte Auswahl von Pandas hier nachlesen: Logische Operatoren für die boolesche Indizierung in Pandas
quelle
df.loc[(df['Set']=="Z") & (df['Type']=="A"), 'Color'] = "green"
Ein Liner mit
.apply()
Methode ist wie folgt:Danach
df
sieht der Datenrahmen folgendermaßen aus:quelle
Wenn Sie mit massiven Daten arbeiten, ist ein gespeicherter Ansatz am besten:
Dieser Ansatz ist am schnellsten, wenn Sie viele wiederholte Werte haben. Meine allgemeine Faustregel lautet, sich zu merken, wann:
data_size
>10**4
&n_distinct
<data_size/4
Ex Merken Sie sich in einem Fall 10.000 Zeilen mit 2.500 oder weniger unterschiedlichen Werten.
quelle
random.choices()
.