Pandas DataFrame: reemplaza todos los valores en una columna, según la condición

132

Tengo un DataFrame simple como el siguiente:

Pandas DataFrame

Quiero seleccionar todos los valores de la columna 'Primera temporada' y reemplazar los que están por encima de 1990 por 1. En este ejemplo, solo Baltimore Ravens tendría el 1996 reemplazado por 1 (manteniendo el resto de los datos intactos).

He usado lo siguiente:

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

Pero, reemplaza todos los valores en esa fila por 1, y no solo los valores en la columna 'Primera temporada'.

¿Cómo puedo reemplazar solo los valores de esa columna?

ichimok
fuente

Respuestas:

226

Necesita seleccionar esa columna:

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

Entonces la sintaxis aquí es:

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

Puede consultar los documentos y también los 10 minutos para pandas que muestran la semántica

EDITAR

Si desea generar un indicador booleano, puede usar la condición booleana para generar una serie booleana y convertir el dtype a intesto se convertirá Truey Falsea 1y 0respectivamente:

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
fuente
40

Un poco tarde para la fiesta pero aún así, prefiero usar numpy donde:

import numpy as np
df['First Season'] = np.where(df['First Season'] > 1990, 1, df['First Season'])
Amir F
fuente
2
Estaba buscando una solución para sobrescribir los valores de las columnas condicionalmente, pero basado en el valor de otra columna, así: df ['col1'] = np.where (df ['id'] == '318431682259014', 'NEW', df ['col1']) Esta fue la solución para ello.
user582175
Estoy tratando de hacer esto para múltiples condiciones como esta, pero sigo haciéndolo ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). Lo que estoy tratando de hacer es básicamente df['A'] = np.where(df['B'] in some_values, df['A']*2, df['A]. ¿Alguien tiene una idea sobre esto?
M.Schalk
5
df['First Season'].loc[(df['First Season'] > 1990)] = 1

Es extraño que nadie tenga esta respuesta, la única parte faltante de su código es la ['Primera temporada'] justo después de df y simplemente quite sus llaves dentro.

Odz
fuente
Eso da un 'SettingWithCopyWarning:' Es mejor usar .loc para todo, como en la respuesta de EdChum.
ambitiousdonut
2

para una sola condición, es decir. ( '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

utilizar este:

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

por lo tanto, la sintaxis aquí es:

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

Para múltiples condiciones, es decir. (df['employrate'] <=55) & (df['employrate'] > 50)

utilizar este:

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

por lo tanto, la sintaxis aquí es:

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

Explicación:

df.loctoma dos argumentos, 'índice de fila' e 'índice de columna'. Estamos verificando si el valor es mayor que 27 de cada valor de fila, en la columna "Primera temporada" y luego lo reemplazamos con 1.

Abdullah shafi
fuente