Python 字符串值着色的条件格式

Python conditional formatting for coloring of string values

我有一个数据框,其中包含如下所示的对象列。这些列包含带分数的字符串值和括号中的增量分数

Manager     engage_final   engage_q1_final    engage_q2_final    engage_q3_final   
John        64% (+5)       66% (+4)           65% (+6)           64% (+5)
Peter       92% (-2)       90% (-1)           91% (-7)           93% (-4) 
Jennifer    98% (nan)      96% (nan)          97% (nan)          96% (nan)
Patricia    95% (0)        95% (-1)           96% (+1)           94% (0)  
Melissa     88% (+3)       85% (+2)           84% (0)            90% (-6)

在将其输出到 excel 之前,我想根据增量分数应用一些条件格式。条件格式涉及根据括号中的值应用一些颜色。 +5 以上为深绿色,+5 为深绿色,+4 为浅绿色,-5 以下为深橙色,-5 为深橙色,-4 为浅橙色等

我试过下面的代码,它不是最优雅的,而且它不起作用。似乎找不到条件格式的许多解决方案。非常感谢任何形式的帮助,谢谢。

columns = [col for col in engage_df.columns if 'engage' in col]


def highlight (engage_df):
    if engage_df[columns].str.contains("+5"):
        return ['background-color: #64A064']
    elif engage_df[columns].str.contains("+4"):
        return ['background-color: #78B478']
    elif engage_df[columns].str.contains("+3"):
        return ['background-color: #8CC88C']
    elif engage_df[columns].str.contain("+2"):
        return ['background-color: #A0DCA0']
    elif engage_df[columns].str.contains("+1"):
        return ['background-color: #B4F0B4']
    elif engage_df[columns].str.contains("+"):
        return ['background-color: #508C50']
    elif engage_df[columns].str.contains("-5"):
        return ['background-color: #F48200']
    elif engage_df[columns].str.contains("-4"):
        return ['background-color: #FF9600']
    elif engage_df[columns].str.contains("-3"):
        return ['background-color: #FFAA00']
    elif engage_df[columns].str.contains("-2"):
        return ['background-color: #FFBE00']
    elif engage_df[columns].str.contains("-1"):
        return ['background-color: #FFD200']
    elif engage_df[columns].str.contains("-"):
        return ['background-color: #FF6E00']
    else:
        return ['background-color: white']

engage_df.style.apply(highlight, axis=1)

为映射值创建字典并仅针对子集参数中的列传递给 Styler.apply

def highlight(x):
    #get +-INT values between ()
    s1 = x.str.extract('\(([+-]*\d+)\)', expand=False)
    #Series with default values
    s = pd.Series('background-color: white', index=x.index)
    #dictionary for match
    d = {'+5':'background-color: #64A064', '+4': 'background-color: #78B478'}
    #if match colot between () add value from dictionary
    for k, v in d.items():
        s.loc[s1 == k] = v
         
    #replace >5 and <-5 values comparing floats values
    s.loc[s1.astype(float) > 5] = 'background-color: #508C50'  
    s.loc[s1.astype(float) < -5] = 'background-color: #FF6E00'  
    return s


cols = [col for col in engage_df.columns if 'engage' in col]
engage_df.style.apply(highlight, subset=cols, axis=1).to_excel('file.xlsx')