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'], )

给我这个结果: