Pandas функция стиля для специальных столбцов

Я пытаюсь написать функцию для использования с стилем pandas. Я хочу, чтобы высокие столбцы указывались в аргументах. Это не очень элегантно, но, например:

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]

затем вызовите с помощью:

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

Я получаю сообщение об ошибке: ( "Объект" Серии "не имеет атрибутов" столбцы ")

Я думаю, что я принципиально не совсем понимаю, как стилист вызывает и применяет эту функцию.

Спасибо,

Ответ 1

Я думаю, вы можете использовать Slicing в Styles для выбора столбцов B и C, а затем Styler.applymap для стильных стилей.

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

Если вы хотите больше цветов или быть более гибкими, используйте Styler.apply(func, axis=None), функция должна вернуть DataFrame с теми же метками индекса и столбца:

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

Ответ 2

Вы можете сделать это немного более динамично:

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

Ответ 3

Работает отлично! Однако как я могу заставить его работать только для заголовков, а не для всего столбца?

Ответ 4

Как насчет того, если мы хотим, чтобы этот процесс только для 1 столбца? Например, будет выделен только столбец "А". Как я могу это сделать?