Стилизация Pandas DataFrame Multiindex

140
04 апреля 2022, 01:40

Каким образом стилизовать (раскрасить) значения DataFrame из одной части колоночного индекса на основании значений из другой части колоночного индекса?

Пример: Если значение колоночного индекса ['Единица'][2019][10] > 0, то значение в ['Количество упаковок'][2019][10] покрасить жёлтым. И так для каждого года и месяца.

Подозреваю, что можно сделать как-то так, но не найду, как именно применить CSS-стиль к конкретной ячейке прямо в функции.

Answer 1

Пример:

Исходный DF:

data = {111: {('Единица', 2019, 10): 1.0,
  ('Единица', 2019, 11): 0.0,
  ('Единица', 2019, 12): 0.0,
  ('Количество упаковок', 2019, 10): 5.0,
  ('Количество упаковок', 2019, 11): 0.0,
  ('Количество упаковок', 2019, 12): 0.0},
 112: {('Единица', 2019, 10): 1.0,
  ('Единица', 2019, 11): 0.0,
  ('Единица', 2019, 12): 1.0,
  ('Количество упаковок', 2019, 10): 2.0,
  ('Количество упаковок', 2019, 11): 0.0,
  ('Количество упаковок', 2019, 12): 1.0}}
df = pd.DataFrame(data).T.rename_axis("id")

решение:

def highlight(df, color="yellow"):
    vals = (df.loc[:, pd.IndexSlice["Единица"]] > 0).to_numpy()
    tmp = np.column_stack((np.zeros_like(vals), vals))
    tmp = np.where(tmp==True, f"background-color: {color}", "")
    tmp = pd.DataFrame(tmp, index=df.index, columns=df.columns)
    return tmp
df.style.apply(highlight, color="yellow", axis=None)

результат:

PS в следующий раз настоятельно рекомендую приводить в вопросе воспроизводимый пример данных...

Answer 2

Ещё один вариант того, как можно решить эту задачу.

def highlight_visit(row):
    ret = ["" for _ in row.index]
    for year in row['Единица'].index.get_level_values(0).unique():
        for month in row['Единица'].index.get_level_values(1).unique():
            if row['Единица'][year][month] > 0:
                ret[row.index.get_loc(
                    ('Количество упаковок', year, month)
                )] = "background-color: yellow"
    return ret

И выгрузка в excel с сохранением форматирования.

df_sales_rnc_acts_grp.style.apply(highlight_visit, axis = 1) \
.to_excel('/Users/vadimvitkauskas/Downloads/colored.xlsx', engine = 'openpyxl')
READ ALSO
nw.js не работает с php файлами

nw.js не работает с php файлами

Сделал сайт на php, решил сделать десктопный клиент, используя nwjs, но столкнулся с проблемой: при запуске nw

200
Слои в html один рисунок на другой

Слои в html один рисунок на другой

У меня проблема мне нужно сделать чтобы одна картинка была внизу а другая как бы поверх егоНо получается все наоборот знает кто нибудь как...

208
Неправильно отображается картинка

Неправильно отображается картинка

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

120
Не работает mysqli через форму

Не работает mysqli через форму

Если прописывать в запрос данные то работает, но если работа через форму то через var_dump выводит NULL

189