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

1038voto

unutbu Punkte 769083

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')
  • ansonsten blau wenn (df['Set'] == 'Z') & (df['Type'] == 'B')
  • ansonsten lila wenn (df['Type'] == 'B')
  • ansonsten 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

181voto

cheekybastard Punkte 5255

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

30voto

bli Punkte 6501

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

Bearbeiten (21.06.2019): Mit plydata

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

28voto

acharuva Punkte 665

Ein weiterer Weg, um dies zu erreichen, wäre

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

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

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