Стиль панд: как выделить диагональные элементы - PullRequest
4 голосов
/ 06 июля 2019

Мне было интересно, как выделить диагональные элементы кадра данных панд, используя метод df.style.

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

Вот пример:

import numpy as np
import pandas as pd

df = pd.DataFrame({'a':[1,2,3,4],'b':[1,3,5,7],'c':[1,4,7,10],'d':[1,5,9,11]})

def highlight_max(s):
    '''
    highlight the maximum in a Series yellow.
    '''
    is_max = s == s.max()
    return ['background-color: yellow' if v else '' for v in is_max]

df.style.apply(highlight_max)

Это дает следующий вывод: enter image description here

Мне нужна желтая подсветка только для диагональных элементов 1,3,7,11.

Как это сделать?

Ответы [ 3 ]

3 голосов
/ 06 июля 2019

Другой ответ довольно хорош, но я уже написал это так ...

def style_diag(data):
    diag_mask = pd.DataFrame("", index=data.index, columns=data.columns)
    min_axis = min(diag_mask.shape)
    diag_mask.iloc[range(min_axis), range(min_axis)] = 'background-color: yellow'
    return diag_mask

df = pd.DataFrame({'a':[1,2,3,4],'b':[1,3,5,7],'c':[1,4,7,10],'d':[1,5,9,11]})
df.style.apply(style_diag, axis=None)
3 голосов
/ 06 июля 2019

Используя axis=None, мы можем использовать numpy, чтобы легко установить стили диагонали (Кредит для этого идет в @CJR)

import numpy as np
import pandas as pd

def highlight_diag(df):
    a = np.full(df.shape, '', dtype='<U24')
    np.fill_diagonal(a, 'background-color: yellow')
    return pd.DataFrame(a, index=df.index, columns=df.columns)

df.style.apply(highlight_diag, axis=None)

enter image description here


Оригинальное, действительно хакерское решение

a = np.full(df.shape, '', dtype='<U24')
np.fill_diagonal(a, 'background-color: yellow')
df_diag = pd.DataFrame(a,
                       index=df.index,
                       columns=df.columns)

def highlight_diag(s, df_diag):
    return df_diag[s.name]

df.style.apply(highlight_diag, df_diag=df_diag)
2 голосов
/ 06 июля 2019

Хитрость заключается в использовании параметра axis=None функции df.style.apply для доступа ко всему набору данных:

import numpy as np
import pandas as pd

df = pd.DataFrame({'a':[1,2,3,4],'b':[1,3,5,7],'c':[1,4,7,10],'d':[1,5,9,11]})

def highlight_diag(data, color='yellow'):
    '''
    highlight the diag values in a DataFrame
    '''
    attr = 'background-color: {}'.format(color)
    # create a new dataframe of the same structure with default style value
    df_style = data.replace(data, '')
    # fill diagonal with highlight color
    np.fill_diagonal(df_style.values, attr)
    return df_style

df.style.apply(highlight_diag, axis=None)

output

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...