Применение стилей панд к произвольным (не продуктовым) подмножествам данных - PullRequest
2 голосов
/ 24 сентября 2019

Как применить стиль к произвольному подмножеству кадра данных панд?В частности, у меня есть фрейм данных df, который содержит несколько NaN, и я хочу применить к нему градиент фона везде, кроме случаев, когда есть NaN (с одинаковой картой цветов, примененной ко всем ячейкам).

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

import numpy as np
import pandas as pd

df = pd.DataFrame(data={'A': [0, 1, np.nan], 'B': [.5, np.nan, 0], 'C': [np.nan, 1, 1]})
mask = ~pd.isnull(df)

Тогда еслиЯ пытаюсь

df.style.background_gradient(subset=mask)

Я получаю ошибку:

IndexingError: Too many indexers

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

Одним из решений может быть цикл по столбцам и применение стиля столбец за столбцом (затем каждое приложение означает для подмножества декартовых произведений).В моем случае я могу передать параметры low и high методу background_gradient, чтобы заставить цветовые карты совпадать между столбцами, но это не удается, когда (как указано выше) один или несколько из этих столбцов содержат уникальныйЗначение NaN.Это, в свою очередь, можно обойти, переписав функцию background_gradient, но это явно нежелательно.

1 Ответ

3 голосов
/ 25 сентября 2019

Вы можете написать пользовательскую функцию для этого:

from matplotlib.cm import get_cmap
cmap = get_cmap('PuBu')

# update with low-high option
def threshold(x,low=0,high=1,mid=0.5):
    # nan cell
    if np.isnan(x): return ''

    # non-nan cell
    x = (x-low)/(high-low)
    background = f'background-color: rgba{cmap (x, bytes=True)}'
    text_color = f'color: white' if x > mid else ''
    return background+';'+text_color

# apply the style
df.style.applymap(threshold, low=-1, high=1, mid=0.3)

Вывод:

enter image description here

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