Aplicación de colores a los valores de un DataFrame pandas

Es posible modificar el formato de los valores mostrados en un DataFrame pandas usando las herramientas de estilo de esta librería.

Supongamos que tenemos un cierto DataFrame:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.uniform(-5, 6, (5, 5)), columns = list("ABCDE"))

df

DataFrame pandas

El método .style.applymap() aplica una función a los valores del DataFrame. Esta función deberá aceptar como argumento un escalar (cada uno de los valores del DataFrame) y deberá devolver una cadena de texto con la pareja CSS "atributo-valor".

Por ejemplo, veamos la siguiente función:

def color_negative_red(val):
    color = 'red' if val < 0 else 'black'
    return 'color: %s' % color

Si el valor recibido es negativo la variable "color" tomará el valor "red". En caso contrario tomará el valor "black". La función devuelve el texto "color: xxxx", siendo "xxxx" el texto con el color en cuestión.

Probémosla con un valor:

color_negative_red(-4)

'color: red'

Ahora basta con ejecutar el método mencionado de nuestro DataFrame, .style.applymap(), pasando como argumento la función anterior:

df.style.applymap(color_negative_red)

DataFrame pandas formateado

El resultado es el DataFrame tras aplicar el formato en cuestión a cada uno de sus valores:

Esto es aplicable con otras propiedades gráficas. Por ejemplo, si deseamos modificar el color de fondo de las celdas del DataFrame de forma que se muestren rojizas para los valores negativos (color "salmon" en el siguiente código) y blancas para los no negativos, podríamos usar la siguiente función:

def text_format(val):
    color = 'salmon' if val < 0 else 'white'
    return 'background-color: %s' % color

Nuevamente, si probamos la función...

text_format(-2)

'background-color: salmon'

...comprobamos que se devuelve una propiedad CSS y su valor en formato de texto. Apliquemos nuestra función al DataFrame:

df.style.applymap(text_format)

DataFrame pandas formateado
Categoría
Enviado por admin el Mar, 23/06/2020 - 09:29