0

我有一些数据包含实际值的列,然后是原始目标值

   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

编辑问题是我得到“真相是模棱两可的错误”:

 df.style.applymap(color_negative_red, target=df['metric_target'], subset=['metric_actual']

我觉得这应该是可能的,但我需要将每行的每个值与同一行中的相应目标值进行比较。

4

1 回答 1

1

在您提供的参考页面中,它说这Styler.applymap是按元素的并且Styler.apply是按列/行/表的。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'], )

给了我这个结果:

在此处输入图像描述

于 2016-10-20T22:08:57.463 回答