web-dev-qa-db-fra.com

Pandas fonction de style pour mettre en évidence des colonnes spécifiques

J'ai essayé d'écrire une fonction à utiliser avec le style pandas. Je veux des colonnes hautes que je spécifie dans les arguments. Ce n'est pas très élégant mais par exemple:

data =  pd.DataFrame(np.random.randn(5, 3), columns=list('ABC'))

def highlight_cols(df, cols, colcolor = 'gray'):
    for col in cols:
        for dfcol in df.columns:
            if col == cols:
                color = colcolor
    return ['background-color: %s' % color]*df.shape[0]

puis appelez avec:

data.style.apply(highlight_cols(cols=['B','C']))

J'obtiens une erreur: ("L'objet 'Series' n'a pas d'attribut 'colonnes'")

Je pense que fondamentalement, je ne comprends pas très bien comment le styler appelle et applique la fonction.

Merci,

11
Maria Petrova

Je pense que vous pouvez utiliser Slicing in Styles pour certaines colonnes B et C puis Styler.applymap Pour les styles élémentaires.

import pandas as pd
import numpy as np

data =  pd.DataFrame(np.random.randn(5, 3), columns=list('ABC'))
#print (data)

def highlight_cols(s):
    color = 'grey'
    return 'background-color: %s' % color

data.style.applymap(highlight_cols, subset=pd.IndexSlice[:, ['B', 'C']])

pic

Si vous voulez plus de couleurs ou être plus flexible, utilisez Styler.apply(func, axis=None), la fonction doit retourner un DataFrame avec les mêmes étiquettes d'index et de colonne:

import pandas as pd
import numpy as np

data =  pd.DataFrame(np.random.randn(5, 3), columns=list('ABC'))
#print (data)

def highlight_cols(x):
    #copy df to new - original data are not changed
    df = x.copy()
    #select all values to default value - red color
    df.loc[:,:] = 'background-color: red'
    #overwrite values grey color
    df[['B','C']] = 'background-color: grey'
    #return color df
    return df    

data.style.apply(highlight_cols, axis=None)

pic1

19
jezrael

Vous pouvez le faire de manière plus dynamique:

data =  pd.DataFrame(np.random.randn(5, 3), columns=list('ABC'))

# dictionary of column colors
coldict = {'A':'grey', 'C':'yellow'}

def highlight_cols(s, coldict):
    if s.name in coldict.keys():
        return ['background-color: {}'.format(coldict[s.name])] * len(s)
    return [''] * len(s)

data.style.apply(highlight_cols, coldict=coldict)

enter image description here

14
MaxU