Pandas DataFrame: Ersetzen Sie alle Werte in einer Spalte basierend auf der Bedingung

132

Ich habe einen einfachen DataFrame wie den folgenden:

Pandas DataFrame

Ich möchte alle Werte aus der Spalte "Erste Staffel" auswählen und diejenigen, die über 1990 liegen, durch 1 ersetzen. In diesem Beispiel würde nur Baltimore Ravens das 1996 durch 1 ersetzen (wobei der Rest der Daten intakt bleibt).

Ich habe folgendes verwendet:

df.loc[(df['First Season'] > 1990)] = 1

Es werden jedoch alle Werte in dieser Zeile durch 1 ersetzt und nicht nur die Werte in der Spalte "Erste Staffel".

Wie kann ich nur die Werte aus dieser Spalte ersetzen?

ichimok
quelle

Antworten:

226

Sie müssen diese Spalte auswählen:

In [41]:
df.loc[df['First Season'] > 1990, 'First Season'] = 1
df

Out[41]:
                 Team  First Season  Total Games
0      Dallas Cowboys          1960          894
1       Chicago Bears          1920         1357
2   Green Bay Packers          1921         1339
3      Miami Dolphins          1966          792
4    Baltimore Ravens             1          326
5  San Franciso 49ers          1950         1003

Die Syntax hier lautet also:

df.loc[<mask>(here mask is generating the labels to index) , <optional column(s)> ]

Sie können die Dokumente und auch die 10 Minuten zu Pandas überprüfen, die die Semantik zeigen

BEARBEITEN

Wenn Sie einen boolean Anzeige generieren möchten , dann können Sie nur die Booleschen Bedingung verwenden , um eine boolean Serie zu erzeugen und werfen die dtype auf intdiese konvertieren Trueund Falsezu 1und 0jeweils:

In [43]:
df['First Season'] = (df['First Season'] > 1990).astype(int)
df

Out[43]:
                 Team  First Season  Total Games
0      Dallas Cowboys             0          894
1       Chicago Bears             0         1357
2   Green Bay Packers             0         1339
3      Miami Dolphins             0          792
4    Baltimore Ravens             1          326
5  San Franciso 49ers             0         1003
EdChum
quelle
40

Ein bisschen spät zur Party, aber trotzdem - ich bevorzuge die Verwendung von Numpy, wo:

import numpy as np
df['First Season'] = np.where(df['First Season'] > 1990, 1, df['First Season'])
Amir F.
quelle
2
Ich suchte nach einer Lösung zum bedingten Überschreiben von Spaltenwerten, die jedoch auf dem Wert einer anderen Spalte basiert: df ['col1'] = np.where (df ['id'] == '318431682259014', 'NEW', df ['col1']) Dies war die Lösung dafür.
user582175
Ich versuche dies für mehrere Bedingungen wie diese zu tun, aber ich bekomme es immer wieder ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). Was ich versuche zu tun, ist im Grunde df['A'] = np.where(df['B'] in some_values, df['A']*2, df['A]. Hat jemand eine Idee dazu?
M.Schalk
5
df['First Season'].loc[(df['First Season'] > 1990)] = 1

seltsam, dass niemand diese Antwort hat, der einzige fehlende Teil Ihres Codes ist die ['Erste Staffel'] direkt nach df und entfernen Sie einfach Ihre geschweiften Klammern darin.

Odz
quelle
Das ergibt ein 'SettingWithCopyWarning': Es ist besser, .loc für das Ganze zu verwenden, wie in EdChums Antwort.
ehrgeiziger
2

für einzelne Bedingung, dh. ( 'employrate'] > 70 )

       country        employrate alcconsumption
0  Afghanistan  55.7000007629394            .03
1      Albania  51.4000015258789           7.29
2      Algeria              50.5            .69
3      Andorra                            10.17
4       Angola  75.6999969482422           5.57

benutze das:

df.loc[df['employrate'] > 70, 'employrate'] = 7

       country  employrate alcconsumption
0  Afghanistan   55.700001            .03
1      Albania   51.400002           7.29
2      Algeria   50.500000            .69
3      Andorra         nan          10.17
4       Angola    7.000000           5.57

Daher lautet die Syntax hier:

df.loc[<mask>(here mask is generating the labels to index) , <optional column(s)> ]

Für mehrere Bedingungen dh. (df['employrate'] <=55) & (df['employrate'] > 50)

benutze das:

df['employrate'] = np.where(
   (df['employrate'] <=55) & (df['employrate'] > 50) , 11, df['employrate']
   )

out[108]:
       country  employrate alcconsumption
0  Afghanistan   55.700001            .03
1      Albania   11.000000           7.29
2      Algeria   11.000000            .69
3      Andorra         nan          10.17
4       Angola   75.699997           5.57

Daher lautet die Syntax hier:

 df['<column_name>'] = np.where((<filter 1> ) & (<filter 2>) , <new value>, df['column_name'])
Harshit Jain
quelle
0
df.loc[df['First season'] > 1990, 'First Season'] = 1

Erläuterung:

df.locakzeptiert zwei Argumente, 'Zeilenindex' und 'Spaltenindex'. Wir prüfen in der Spalte "Erste Saison", ob der Wert größer als 27 jedes Zeilenwerts ist, und ersetzen ihn dann durch 1.

Abdullah Shafi
quelle