Python pandas equivalente para reemplazar

En R, hay una función de replace bastante útil. Esencialmente, realiza una reasignación condicional en una columna dada de un dataframe. Se puede usar como tal: replace(df$column, df$column==1,'Type 1');

¿Cuál es una buena manera de lograr lo mismo en los pandas?

¿Debo usar un lambda con apply ? (Si es así, ¿cómo obtengo una referencia a la columna dada, en lugar de una fila completa).

¿Debo usar np.where en data_frame.values ? Parece que me estoy perdiendo algo muy obvio aquí.

Cualquier sugerencia es apreciada.

pandas tiene un método de replace también:

 In [25]: df = DataFrame({1: [2,3,4], 2: [3,4,5]}) In [26]: df Out[26]: 1 2 0 2 3 1 3 4 2 4 5 In [27]: df[2] Out[27]: 0 3 1 4 2 5 Name: 2 In [28]: df[2].replace(4, 17) Out[28]: 0 3 1 17 2 5 Name: 2 In [29]: df[2].replace(4, 17, inplace=True) Out[29]: 0 3 1 17 2 5 Name: 2 In [30]: df Out[30]: 1 2 0 2 3 1 3 17 2 4 5 

o podrías usar la indexación avanzada de estilo numpy :

 In [47]: df[1] Out[47]: 0 2 1 3 2 4 Name: 1 In [48]: df[1] == 4 Out[48]: 0 False 1 False 2 True Name: 1 In [49]: df[1][df[1] == 4] Out[49]: 2 4 Name: 1 In [50]: df[1][df[1] == 4] = 19 In [51]: df Out[51]: 1 2 0 2 3 1 3 17 2 19 5 

Pandas doc para replace no tiene ningún ejemplo, así que daré algunos aquí. Para aquellos que vienen de una perspectiva R (como yo), replace es básicamente una función de reemplazo de uso múltiple que combina la funcionalidad de las funciones R plyr::mapvalues , plyr::revalue stringr::str_replace_all y stringr::str_replace_all . Como DSM cubrió el caso de valores únicos, cubriré el caso de valores múltiples.

Serie ejemplo

 In [10]: x = pd.Series([1, 2, 3, 4]) In [11]: x Out[11]: 0 1 1 2 2 3 3 4 dtype: int64 

Queremos reemplazar los enteros positivos con enteros negativos (y no multiplicando por -1).

Dos listas de valores

Una forma de hacerlo es tener una lista (o serie de pandas) de los valores que queremos reemplazar y una segunda lista con los valores con los que queremos reemplazarlos.

 In [14]: x.replace([1, 2, 3, 4], [-1, -2, -3, -4]) Out[14]: 0 -1 1 -2 2 -3 3 -4 dtype: int64 

Esto corresponde a plyr::mapvalues .

Diccionario de pares de valores

A veces es más conveniente tener un diccionario de pares de valores. El índice es el que reemplazamos y el valor es el que reemplazamos.

 In [15]: x.replace({1: -1, 2: -2, 3: -3, 4: -4}) Out[15]: 0 -1 1 -2 2 -3 3 -4 dtype: int64 

Esto corresponde a plyr::revalue .

Instrumentos de cuerda

Funciona de manera similar para cadenas, excepto que también tenemos la opción de usar patrones de expresiones regulares.

Si simplemente queremos reemplazar cadenas por otras cadenas, funciona exactamente igual que antes:

 In [18]: s = pd.Series(["ape", "monkey", "seagull"]) In [22]: s Out[22]: 0 ape 1 monkey 2 seagull dtype: object 

Dos listas

 In [25]: s.replace(["ape", "monkey"], ["lion", "panda"]) Out[25]: 0 lion 1 panda 2 seagull dtype: object 

Diccionario

 In [26]: s.replace({"ape": "lion", "monkey": "panda"}) Out[26]: 0 lion 1 panda 2 seagull dtype: object 

Regex

Reemplace todos los a s con x s.

 In [27]: s.replace("a", "x", regex=True) Out[27]: 0 xpe 1 monkey 2 sexgull dtype: object 

Reemplace todos los l s con x s.

 In [28]: s.replace("l", "x", regex=True) Out[28]: 0 ape 1 monkey 2 seaguxx dtype: object 

Tenga en cuenta que ambos l s en seagull fueron reemplazados.

Reemplaza a s con x s y l s con p s

 In [29]: s.replace(["a", "l"], ["x", "p"], regex=True) Out[29]: 0 xpe 1 monkey 2 sexgupp dtype: object 

En el caso especial en el que uno quiere reemplazar varios valores diferentes con el mismo valor, simplemente se puede usar una sola cadena como reemplazo. No debe estar dentro de una lista. Reemplace a s y l s con p s

 In [29]: s.replace(["a", "l"], "p", regex=True) Out[29]: 0 ppe 1 monkey 2 sepgupp dtype: object 

(Crédito a DaveL17 en los comentarios)