如何从 pandas 枢轴 table 中的样式(子集)中排除总行(边距)

How to exclude the total row (margins) from styling (subset) in a pandas pivot table

我有一个 .pivot_table 边距 = True.

我想 运行 .style.bar 和 .style.background_gradient 但问题是边距(列总数)也被格式化并设置为最大值所以它看起来非描述性的。

我有一些关于如何解决这个问题的想法,但是,none 目前正在工作:

  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

所以目标是从格式中排除最后一行(所有/边距/总计列)。

你必须更明确一点,但你可以用 get_level_valuespd.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)))