Python pandas equivalente para sustituir

En R, es bastante útil replace función.
Esencialmente, no condicional de la re-asignación en una columna determinada de un marco de datos.
Puede ser utilizado como así:
replace(df$column, df$column==1,'Type 1');

Lo que es una buena manera de lograr lo mismo en los pandas?

Debo usar una expresión lambda apply? (Si es así, ¿cómo puedo obtener una referencia a la columna, frente a toda una fila).

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

Cualquier sugerencia se agradece.

InformationsquelleAutor ivan-k | 2012-08-28

2 Kommentare

  1. 28

    pandas tiene un replace método 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 usted podría utilizar numpyde estilo avanzado de indexación:

    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
    • Me duele que no me lea el manual atentamente suficiente.
    • Para ser perfectamente honesto, yo casi nunca leer los manuales o bien, hasta que algo realmente me confunde. Pero una de las ventajas de la utilización de un intérprete inteligente como IPython es que usted puede construir un objeto como df y, a continuación, utilizar el autocompletado para ver qué métodos vivir dentro de él.
    • Que es cierto. iPython es una cosa de la belleza. En mi defensa, la función de reemplazo no está en la lista aquí
    • Je! Tal vez mi nunca-leer-el-manual de política tiene más sentido de lo que pensaba! :^)
    • Es aquí a pesar de que =P
  2. 6

    Los Pandas doc para reemplace no tiene ningún tipo de ejemplos, así que voy a darle algunos aquí. Para los que vienen de un R perspectiva (como yo), replace es básicamente un propósito de todos reemplazo de la función que combina la funcionalidad de las funciones R plyr::mapvalues, plyr::revalue y stringr::str_replace_all. Desde DSM cubierto el caso de los valores individuales, voy a cubrir el valor múltiple de casos.

    Ejemplo de la serie

    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 números enteros negativos (y no por multiplicamos por -1).

    Dos listas de valores

    Una manera de hacer esto a través de una lista (o pandas de la serie) de los valores que desea reemplazar y una segunda lista con los valores que queremos reemplazar.

    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 nos reemplazar y el valor es el que nos reemplazarlo.

    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.

    Cadenas

    Funciona de manera similar para las cadenas, excepto que también tenemos la opción de utilizar los patrones de regex.

    Si simplemente queremos reemplazar cadenas con otras cadenas, funciona exactamente de la misma como 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

    Reemplazar todos los as con xs.

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

    Reemplazar todos los ls con xs.

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

    Nota que ambos ls en seagull fueron reemplazados.

    Reemplazar as con xs y ls con ps

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

    En el caso especial donde uno quiere para sustituir a varios valores diferentes con el mismo valor, uno puede simplemente una sola cadena como la de reemplazo. No debe estar dentro de una lista. Reemplazar as y ls con ps

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

    (El crédito DaveL17 en los comentarios)

    • +1 para una bonita serie de ejemplos. Para los futuros visitantes, también se puede sustituir varios valores con un valor único s.replace(["a", "l"], "x", regex=True) pero el único valor de reposición no puede estar en una lista (la ‘desde’ y ‘hasta’ listas deben ser de igual valor para el trabajo.)
    • He añadido tu ejemplo.
    • Saludos. No puedo editar mi comentario anterior, pero sería mejor descrito como (el » de » y «para» las listas deben ser de igual a longitud con el fin de trabajar.)

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea