Как исключить итоговую строку (поля) из стиля (подмножество) в сводной таблице панд - PullRequest
1 голос
/ 09 июля 2019

У меня есть .pivot_table с полями = True.

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

У меня было несколько идей о том, как решить эту проблему, однако ни одна из них не работает до сих пор:

  1. Пробовал как-то исключить последнюю строку (поля / столбцы итогов) из .style с использованием подмножества, но не получилось.
  2. Сохранение последней строки в отдельном фрейме данных. Удаление последней строки из исходного фрейма данных, применение .style и последующая конкатенация обоих фреймов данных, однако, здесь я получаю ошибку, что не могу объединить стилизованные фреймы данных.

Вот код:

import pandas as pd
import numpy as np
import seaborn as sns

df = pd.DataFrame({"A": ["foo", "foo", "foo", "foo", "foo",
                      "bar", "bar", "bar", "bar"],
                "B": ["one", "one", "one", "two", "two",
                      "one", "one", "two", "two"],
                "C": ["small", "large", "large", "small",
                      "small", "large", "small", "small",
                     "large"],
                "D": [1, 2, 2, 3, 3, 4, 5, 6, 7]})

df = df.pivot_table(values='D', index=['A','B'], columns=['C'], aggfunc=np.sum, margins=True, fill_value = 0)

df = (df.style.background_gradient(subset = 'large', cmap = sns.light_palette('red', as_cmap = True))
      .background_gradient(subset = 'small', cmap = sns.light_palette('green', as_cmap = True)))
df

Output

Таким образом, цель состоит в том, чтобы исключить последнюю строку из форматирования (столбец Все / Поля / Итого).

1 Ответ

1 голос
/ 09 июля 2019

Вы должны быть немного более явным, но вы можете выполнить то, что вам нужно, с помощью get_level_values и pd.IndexSlice


u = df.index.get_level_values(0)

(df.style.background_gradient(
  subset = pd.IndexSlice[u[:-1], 'large'],
  cmap = sns.light_palette('red', as_cmap = True))
.background_gradient(
  subset = pd.IndexSlice[u[:-1], 'small'],
  cmap = sns.light_palette('green', as_cmap = True)))

enter image description here

...