Pandas DataFrame: sostituisci tutti i valori in una colonna, in base alla condizione


132

Ho un semplice DataFrame come il seguente:

Pandas DataFrame

Desidero selezionare tutti i valori dalla colonna "Prima stagione" e sostituire quelli che sono oltre il 1990 con 1. In questo esempio, solo Baltimore Ravens avrebbe sostituito il 1996 con 1 (mantenendo intatto il resto dei dati).

Ho usato quanto segue:

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

Tuttavia, sostituisce tutti i valori in quella riga con 1 e non solo i valori nella colonna "Prima stagione".

Come posso sostituire solo i valori di quella colonna?

Risposte:


226

Devi selezionare quella colonna:

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

Quindi la sintassi qui è:

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

Puoi controllare i documenti e anche i 10 minuti per i panda che mostra la semantica

MODIFICARE

Se vuoi generare un indicatore booleano, puoi semplicemente usare la condizione booleana per generare una serie booleana e lanciare il dtype a intquesto convertirà Truee Falsein 1e 0rispettivamente:

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

40

Un po 'in ritardo per la festa ma comunque - preferisco usare numpy dove:

import numpy as np
df['First Season'] = np.where(df['First Season'] > 1990, 1, df['First Season'])

2
Stavo cercando una soluzione per sovrascrivere i valori delle colonne in modo condizionale, ma in base al valore di un'altra colonna, come questo: df ['col1'] = np.where (df ['id'] == '318431682259014', 'NEW', df ['col1']) Questa era la soluzione.
user582175

Sto cercando di farlo per più condizioni come questa, ma continuo a ottenere ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). Quello che sto cercando di fare è fondamentalmente df['A'] = np.where(df['B'] in some_values, df['A']*2, df['A]. Qualcuno ha un'idea su questo?
M.Schalk

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

strano che nessuno abbia questa risposta, l'unica parte mancante del tuo codice è la ['prima stagione'] subito dopo df e rimuovi semplicemente le parentesi graffe all'interno.


Questo dà un 'SettingWithCopyWarning:' È meglio usare .loc per l'intera cosa come nella risposta di EdChum.
ambitiousdonut

2

per singola condizione, ad es. ( '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

Usa questo:

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

quindi la sintassi qui è:

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

Per più condizioni es. (df['employrate'] <=55) & (df['employrate'] > 50)

Usa questo:

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

quindi la sintassi qui è:

 df['<column_name>'] = np.where((<filter 1> ) & (<filter 2>) , <new value>, df['column_name'])

0
df.loc[df['First season'] > 1990, 'First Season'] = 1

Spiegazione:

df.locaccetta due argomenti, "indice di riga" e "indice di colonna". Stiamo controllando se il valore è maggiore di 27 di ogni valore di riga, nella colonna "Prima stagione" e poi lo sostituiamo con 1.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.