Python Pandas style highlight specific cells for each column with different condition

Question:

I’m trying to highlight specific cells for each column with different condition which their value matches the condition for each row.

Below image is what I want to achieve:
The table I attempt to achieve

I searched google and stackoverflow but none of these can meet my requirement. Can anyone who’s familiar with Pandas Style could assist?

Below are the codes I tried and failed:

Ex1

import pandas as pd
df = pd.DataFrame([[10,3,1], [3,7,2], [2,4,4]], columns=list("ABC"))

def highlight(s):
    return ['background-color: yellow' if (v>2) else 'background-color: white' for v in s]
df.style.apply(highlight, axis=0)

Ex2

import pandas as pd
df = pd.DataFrame([[10,3,1], [3,7,2], [2,4,4]], columns=list("ABC"))

Column_limit = (df['A'] > 6) | (df['B'] > 2) | (df['C'] < 3)
df[Column_limit].style.applymap(lambda x: 'background-color: yellow', subset=pd.IndexSlice[:, ['A', 'C']])

Ex3

import pandas as pd
df = pd.DataFrame([[10,3,1], [3,7,2], [2,4,4]], columns=list("ABC"))

subsets = pd.IndexSlice[:, 'A']
df.style.applymap(lambda x: 'background-color: yellow', subset = subsets)
Asked By: Kelvin Lo

||

Answers:

If there is same number of conditions like some number of columns use:

df = pd.DataFrame([[10,3,1], [3,7,2], [2,4,4]], columns=list("ABC"))

def highlight(x):
    c1 = 'background-color: yellow'

    # condition
    m = pd.concat([(x['A'] > 6), (x['B'] > 2), (x['C'] < 3)], axis=1)
    #print (m)
    #empty DataFrame of styles
    df1 = pd.DataFrame('', index=x.index, columns=x.columns)
    #set new columns by condition
    return df1.mask(m, c1)


df.style.apply(highlight, axis=None)

If there is a lot of columns and need processing only some of them:

def highlight(x):
    c1 = 'background-color: yellow'

    #empty DataFrame of styles
    df1 = pd.DataFrame('', index=x.index, columns=x.columns)
    #set new columns by condition
    
    df1.loc[(x['A'] > 6), 'A'] = c1
    df1.loc[(x['B'] > 2), 'B'] = c1
    df1.loc[(x['C'] < 3), 'C'] = c1
    
    return df1

df.style.apply(highlight, axis=None)

EDIT:

If need specified all masks but in last step filter only some columns use:

def highlight(x):
    c1 = 'background-color: yellow'

    #empty DataFrame of styles
    df1 = pd.DataFrame('', index=x.index, columns=x.columns)
    #set new columns by condition
    
    df1.loc[(x['A'] > 6), 'A'] = c1
    df1.loc[(x['B'] > 2), 'B'] = c1
    df1.loc[(x['C'] < 3), 'C'] = c1
    
    need = ['A','C']
    df1 = df1[need].reindex(x.columns, fill_value='', axis=1)
    return df1

Or remove masks which not necessary:

def highlight(x):
    c1 = 'background-color: yellow'

    #empty DataFrame of styles
    df1 = pd.DataFrame('', index=x.index, columns=x.columns)
    #set new columns by condition
    
    df1.loc[(x['A'] > 6), 'A'] = c1
    df1.loc[(x['C'] < 3), 'C'] = c1
    
    return df1

df.style.apply(highlight, axis=None)
Answered By: jezrael