Wie füge ich eine Farbe
-Spalte zum folgenden DataFrame hinzu, so dass Farbe='grün'
ist, wenn Set == 'Z'
und Farbe='rot'
sonst?
Typ Set
1 A Z
2 B Z
3 B X
4 C Y
Wie füge ich eine Farbe
-Spalte zum folgenden DataFrame hinzu, so dass Farbe='grün'
ist, wenn Set == 'Z'
und Farbe='rot'
sonst?
Typ Set
1 A Z
2 B Z
3 B X
4 C Y
Sie können einfach die leistungsstarke .loc
Methode verwenden und je nach Bedarf eine oder mehrere Bedingungen festlegen (getestet mit pandas=1.0.5).
Code-Zusammenfassung:
df=pd.DataFrame(dict(Type='A B B C'.split(), Set='Z Z X Y'.split()))
df['Color'] = "red"
df.loc[(df['Set']=="Z"), 'Color'] = "green"
#Übung!
df.loc[(df['Set']=="Z")&(df['Type']=="B")|(df['Type']=="C"), 'Color'] = "purple"
Erklärung:
df=pd.DataFrame(dict(Type='A B B C'.split(), Set='Z Z X Y'.split()))
# bisheriges df:
Type Set
0 A Z
1 B Z
2 B X
3 C Y
Fügen Sie eine 'Farbe' Spalte hinzu und setzen Sie alle Werte auf "rot"
df['Color'] = "red"
Wenden Sie Ihre einzelne Bedingung an:
df.loc[(df['Set']=="Z"), 'Color'] = "green"
# df:
Type Set Color
0 A Z green
1 B Z green
2 B X red
3 C Y red
oder mehrere Bedingungen, wenn Sie möchten:
df.loc[(df['Set']=="Z")&(df['Type']=="B")|(df['Type']=="C"), 'Color'] = "purple"
Sie können hier über die logischen Operatoren und die bedingte Auswahl in Pandas lesen: Logische Operatoren für die boolesche Indizierung in Pandas
Sie können die pandas-Methoden where
und mask
verwenden:
df['color'] = 'green'
df['color'] = df['color'].where(df['Set']=='Z', other='red')
# Ersetzen Sie Werte, bei denen die Bedingung falsch ist
oder
df['color'] = 'red'
df['color'] = df['color'].mask(df['Set']=='Z', other='green')
# Ersetzen Sie Werte, bei denen die Bedingung wahr ist
Alternativ können Sie die Methode transform
mit einer Lambda-Funktion verwenden:
df['color'] = df['Set'].transform(lambda x: 'green' if x == 'Z' else 'red')
Ausgabe:
Type Set color
1 A Z green
2 B Z green
3 B X red
4 C Y red
Leistungsvergleich von @chai:
import pandas as pd
import numpy as np
df = pd.DataFrame({'Type':list('ABBC')*1000000, 'Set':list('ZZXY')*1000000})
%timeit df['color1'] = 'red'; df['color1'].where(df['Set']=='Z','green')
%timeit df['color2'] = ['red' if x == 'Z' else 'green' for x in df['Set']]
%timeit df['color3'] = np.where(df['Set']=='Z', 'red', 'green')
%timeit df['color4'] = df.Set.map(lambda x: 'red' if x == 'Z' else 'green')
397 ms ± 101 ms pro Schleife (Durchschnitt ± Standardabweichung von 7 Schleifen)
976 ms ± 241 ms pro Schleife
673 ms ± 139 ms pro Schleife
796 ms ± 182 ms pro Schleife
Wenn Sie nur 2 Optionen haben, verwenden Sie np.where()
df = pd.DataFrame({'A':range(3)})
df['B'] = np.where(df.A>2, 'ja', 'nein')
Wenn Sie mehr als 2 Optionen haben, könnte apply()
funktionieren
arr = pd.DataFrame({'A':list('abc'), 'B':range(3), 'C':range(3,6), 'D':range(6, 9)})
und arr ist
A B C D
0 a 0 3 6
1 b 1 4 7
2 c 2 5 8
Wenn Sie möchten, dass die Spalte E if arr.A =='a' then arr.B elif arr.A=='b' then arr.C elif arr.A == 'c' then arr.D else something_else
ist
arr['E'] = arr.apply(lambda x: x['B'] if x['A']=='a' else(x['C'] if x['A']=='b' else(x['D'] if x['A']=='c' else 1234)), axis=1)
und schließlich ist arr
A B C D E
0 a 0 3 6 0
1 b 1 4 7 4
2 c 2 5 8 8
Die case_when Funktion von pyjanitor ist ein Wrapper um pd.Series.mask
und bietet eine verkettbare/praktische Form für mehrere Bedingungen:
Für eine einzelne Bedingung:
df.case_when(
df.col1 == "Z", # Bedingung
"grün", # Wert wenn wahr
"rot", # Wert wenn falsch
column_name = "Farbe"
)
Typ Set Farbe
1 A Z grün
2 B Z grün
3 B X rot
4 C Y rot
Für mehrere Bedingungen:
df.case_when(
df.Set.eq('Z') & df.Typ.eq('A'), 'gelb', # Bedingung, Ergebnis
df.Set.eq('Z') & df.Typ.eq('B'), 'blau', # Bedingung, Ergebnis
df.Typ.eq('B'), 'lila', # Bedingung, Ergebnis
'schwarz', # Standard wenn keine der Bedingungen wahr ist
column_name = 'Farbe'
)
Typ Set Farbe
1 A Z gelb
2 B Z blau
3 B X lila
4 C Y schwarz
Weitere Beispiele finden Sie hier
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.