495 Stimmen

Wie erstelle ich eine neue Spalte, in der die Werte basierend auf vorhandenen Spalten ausgewählt werden?

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

25voto

Hossein Kalbasi Punkte 1323

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

5voto

Mykola Zotko Punkte 11977

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

3voto

xiaotong xu Punkte 291

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

2voto

Jaroslav Bezděk Punkte 6369

Ein Liner mit der Methode .apply() sieht wie folgt aus:

df['color'] = df['Set'].apply(lambda set_: 'grün' if set_=='Z' else 'rot')

Danach sieht das df Datenrahmen so aus:

>>> print(df)
  Type Set  color
0    A   Z  grün
1    B   Z  grün
2    B   X    rot
3    C   Y    rot

2voto

sammywemmy Punkte 26590

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.com

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.

Powered by:

X