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
Wenn Sie nur zwei Auswahlmöglichkeiten haben, verwenden Sie np.where
:
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 möchten, dass color
ist
gelb
wenn (df['Set'] == 'Z') & (df['Type'] == 'A')
blau
wenn (df['Set'] == 'Z') & (df['Type'] == 'B')
lila
wenn (df['Type'] == 'B')
schwarz
,dann verwenden Sie
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 = ['gelb', 'blau', 'lila']
df['color'] = np.select(conditions, choices, default='schwarz')
print(df)
was ergibt
Set Type color
0 Z A gelb
1 Z B blau
2 X B lila
3 Y C schwarz
List comprehension is another way to create another column conditionally. If you are working with object dtypes in columns, like in your example, list comprehensions typically outperform most other methods.
Beispiel List Comprehension:
df['color'] = ['rot' if x == 'Z' else 'grün' for x in df['Set']]
%timeit Tests:
import pandas as pd
import numpy as np
df = pd.DataFrame({'Type':list('ABBC'), 'Set':list('ZZXY')})
%timeit df['color'] = ['rot' if x == 'Z' else 'grün' for x in df['Set']]
%timeit df['color'] = np.where(df['Set']=='Z', 'grün', 'rot')
%timeit df['color'] = df.Set.map( lambda x: 'rot' if x == 'Z' else 'grün')
1000 loops, best of 3: 239 µs per loop
1000 loops, best of 3: 523 µs per loop
1000 loops, best of 3: 263 µs per loop
Das Folgende ist langsamer als die hier getimten 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, das nur die Spalte "Set" verwendet:
def set_color(row):
if row["Set"] == "Z":
return "rot"
else:
return "grün"
df = df.assign(color=df.apply(set_color, axis=1))
print(df)
Set Type color
0 Z A rot
1 Z B rot
2 X B grün
3 Y C grün
Beispiel mit mehr Farben und mehr berücksichtigten Spalten:
def set_color(row):
if row["Set"] == "Z":
return "rot"
elif row["Type"] == "C":
return "blau"
else:
return "grün"
df = df.assign(color=df.apply(set_color, axis=1))
print(df)
Set Type color
0 Z A rot
1 Z B rot
2 X B grün
3 Y C blau
Es ist auch möglich, plydata zu verwenden, um solche Dinge zu tun (das scheint sogar langsamer zu sein als die Verwendung von assign
und apply
).
from plydata import define, if_else
Einfaches if_else
:
df = define(df, color=if_else('Set=="Z"', '"rot"', '"grün"'))
print(df)
Set Type color
0 Z A rot
1 Z B rot
2 X B grün
3 Y C grün
Verschachteltes if_else
:
df = define(df, color=if_else(
'Set=="Z"',
'"rot"',
if_else('Type=="C"', '"grün"', '"blau"')))
print(df)
Set Type color
0 Z A rot
1 Z B rot
2 X B blau
3 Y C grün
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
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.