0

Consider the simple example below

df = pd.DataFrame({'text' : ['hello world'],
                   'var1' : [0.1],
                   'var2' : [0.2]})

#this highlights the highest number in red
def highlight_max(s, props = ''):
    return np.where(s == np.nanmax(s.values), props, '')

#this turns the numbers into percentages
df.style.format({'var1' : '{:,.2%}'.format,
                 'var2' : '{:,.2%}'.format})

I am trying to automatically highlight the highest number (by rows) in red AND format any number into percentage. I have the two pieces separately but I do not know how to do this in just one .style call. Any ideas?

Thanks!

1 Answer 1

2

highlight_max is a builtin function, we can chain calls to produce a styled table, or store the styler as a variable and reuse it to apply multiple styles:

numeric_cols = ['var1', 'var2']
(
    df.style.highlight_max(color='red', axis=1, subset=numeric_cols)
        .format('{:,.2%}'.format, subset=numeric_cols)
)

Or

numeric_cols = ['var1', 'var2']
styler = df.style
styler.highlight_max(color='red', axis=1, subset=numeric_cols)
styler.format('{:,.2%}'.format, subset=numeric_cols)

The user-defined function can be used as well by using Styler.apply on axis=1 and defining props to the desired CSS styles:

#this highlights the highest number in red
def highlight_max(s, props = ''):
    return np.where(s == np.nanmax(s.values), props, '')

numeric_cols = ['var1', 'var2']
#this turns the numbers into percentages
(
    df.style
        .apply(highlight_max, props='background-color: red',
               subset=numeric_cols, axis=1)
        .format('{:,.2%}'.format, subset=numeric_cols)
)

All options produce styled DataFrame:

styled dataframe


If needed the numeric_cols list of columns can be generated dynamically with something like:

numeric_cols = df.select_dtypes(include='number').columns

Or:

numeric_cols = df.columns[(df.dtypes == 'int64') | (df.dtypes == 'float64')]
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.