如何从 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 目前正在工作:
- 尝试使用子集以某种方式从 .style 中排除最后一行(边距/总列),但失败了。
- 将最后一行保存在单独的数据框中。从原始数据帧中删除最后一行,应用 .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_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)))
我有一个 .pivot_table 边距 = True.
我想 运行 .style.bar 和 .style.background_gradient 但问题是边距(列总数)也被格式化并设置为最大值所以它看起来非描述性的。
我有一些关于如何解决这个问题的想法,但是,none 目前正在工作:
- 尝试使用子集以某种方式从 .style 中排除最后一行(边距/总列),但失败了。
- 将最后一行保存在单独的数据框中。从原始数据帧中删除最后一行,应用 .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_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)))