Pandas Styling - Окрашивание ячеек указанных столбцов c вместо всего DataFrame - PullRequest
1 голос
/ 11 февраля 2020

Я написал следующий блок кода для окраски некоторых ячеек в моем фрейме данных.

def applycolor(dtf):

        return ['background-color: lightgreen' if x >= 1500  else 
        ('background-color: lightskyblue' if 1000 <= x < 1500  else 
        'background-color: pink' if 750 <= x < 1000 else
        'background-color: wheat' if  550 <= x < 750 else 
        'background-color: paleturquoise' if 330 <= x < 550  else 
        'background-color: darkseagreen' if 150 <= x < 330 else 'background-color: default') for x in dtf]    


cs1 = cs.style.apply(applycolor, axis=0)

Это дало мне результат, как показано на рисунке.

enter image description here Однако я хочу, чтобы цвета отображались только для цифр, указанных в df['$-Score']. Но этот стиль добавлял цвета ко всем соответствующим числовым значениям кадра данных, как видно.

Я попытался изменить последнюю строку списка, чтобы включить в нее только определенный столбец кадра данных, например: .....if 150 <= x < 330 else 'background-color: default') for x in dtf['$-Score'] - но он вернул ошибку.

Попытался найти указанный c ответ, но не смог его найти. Любые идеи?

В качестве альтернативы, ОБРАЗЕЦ ДАННЫХ:

    A    B   C
0   83  76  30
1   34  17  44
2   72  16  94
3   24  94  27
4   98  36  35
5   41  77  39
6   65  54  18
7   85  1   59
8   12  79  2
9   33  57  76
10  66  69  100
11  99  51  89
12  24  74  32
13  51  98  63
14  63  36  82
15  53  52  65

Я хочу, чтобы только цифры между 55 и 58 были окрашены в красный цвет в столбце B и синие между 84 и 87 в столбце C только.

Как я могу go об этом?

1 Ответ

0 голосов
/ 12 февраля 2020

Style.apply работает так же, как DataFrame.apply, в том, что информационный кадр разбивается на серии, и в вашем случае вы хотите сделать что-то другое в зависимости от имени каждой серии (то есть имени столбца). Таким образом, приведенный ниже пример может быть расширен для ваших целей:

def apply_formatting(col):
    if col.name == 'a':
        return ['background-color: red' if c > 50 else '' for c in col.values]
    if col.name == 'b':
        return ['background-color: green' if c > 10 else '' for c in col.values]
    if col.name == 'c':
        return ['background-color: blue' if c > 30 else '' for c in col.values]

data = pd.DataFrame(
    np.random.randint(0, 100, 30).reshape(10, 3), columns=['a', 'b', 'c'])

data.style.apply(apply_formatting)  # axis=0 by default

Вот результат для случайных данных:

enter image description here

...