pandas - 使用样式器将实际值与目标值进行比较
pandas - compare actual value against a target with styler
我有一些数据,其中包含实际值列和原始目标值列
dimension | metric_actual | metric_target | metric2_actual | metric2_target
A 16.41 20.00 68.54% 72.00%
B 17.39 18.00 63.87% 60.00%
理想情况下,如果 metric_actual 小于目标,我希望单元格显示红色文本,如果大于目标,则显示绿色文本。
我想使用 .style 选项将数据框输出到电子邮件中。我似乎无法弄清楚如何逐行执行此操作,但如果每一行的目标可能不同。
http://pandas.pydata.org/pandas-docs/stable/style.html
这些函数有效,但前提是我有一个静态列。我的问题是数据中每一行的相同指标的目标不同。
def color_negative_red(value, target):
color = 'red' if value < target else 'green'
return 'color: %s' % color
编辑问题是我得到 'truth is ambiguous errors':
df.style.applymap(color_negative_red, target=df['metric_target'], subset=['metric_actual']
我觉得这应该是可能的,但我需要将每行的每个值与同一行中相应的目标值进行比较。
在您提供的参考页中,它说 Styler.applymap
是按元素的,Styler.apply
是 column-/row-/table-wise。我使用了分别修改了 color_negative_red
函数的列式版本。
import pandas as pd
def color_negative_red(value, target):
is_smaller = value < target # a pandas.Series of dtype bool
colors = is_smaller.apply(lambda b: 'color: red' if b else 'color: green') # a pandas.Series of dtype object (i.e. str)
return colors
df = pd.DataFrame(data={'metric_actual': [16.41, 17.39, 28.23],
'metric_target': [20.00, 18.00, 19.00]})
df.style.apply(color_negative_red, target=df['metric_target'], subset=['metric_actual'], )
给我这个结果:
我有一些数据,其中包含实际值列和原始目标值列
dimension | metric_actual | metric_target | metric2_actual | metric2_target
A 16.41 20.00 68.54% 72.00%
B 17.39 18.00 63.87% 60.00%
理想情况下,如果 metric_actual 小于目标,我希望单元格显示红色文本,如果大于目标,则显示绿色文本。
我想使用 .style 选项将数据框输出到电子邮件中。我似乎无法弄清楚如何逐行执行此操作,但如果每一行的目标可能不同。
http://pandas.pydata.org/pandas-docs/stable/style.html
这些函数有效,但前提是我有一个静态列。我的问题是数据中每一行的相同指标的目标不同。
def color_negative_red(value, target):
color = 'red' if value < target else 'green'
return 'color: %s' % color
编辑问题是我得到 'truth is ambiguous errors':
df.style.applymap(color_negative_red, target=df['metric_target'], subset=['metric_actual']
我觉得这应该是可能的,但我需要将每行的每个值与同一行中相应的目标值进行比较。
在您提供的参考页中,它说 Styler.applymap
是按元素的,Styler.apply
是 column-/row-/table-wise。我使用了分别修改了 color_negative_red
函数的列式版本。
import pandas as pd
def color_negative_red(value, target):
is_smaller = value < target # a pandas.Series of dtype bool
colors = is_smaller.apply(lambda b: 'color: red' if b else 'color: green') # a pandas.Series of dtype object (i.e. str)
return colors
df = pd.DataFrame(data={'metric_actual': [16.41, 17.39, 28.23],
'metric_target': [20.00, 18.00, 19.00]})
df.style.apply(color_negative_red, target=df['metric_target'], subset=['metric_actual'], )
给我这个结果: