I have the following dataframe and want to convert it to HTML
Limit Status Warning 3M AVG
VAR1 1.20 1.21216 1.11 1.21235
VAR2 0.82 0.63075 0.75 0.593295
VAR3 0.38 0.376988 0.35 0.376988
VAR4 0.17 0.126987 0.14 0.12461
I want to format this dataframe row-wise such that:
Status
exceeds Warning
the whole row becomes highlighted yellow and if it exceeds Limit
the whole row becomes highlighted redVAR2
and VAR3
have "{:.2%}" format and VAR1
and VAR4
have "{:.2f}"I've dug into pandas documentation and tried a couple of methods but I couldn't do all of the above tasks
I would appreciate if you could help since I believe it's a challenge for many pandas users to format a dataframe row wise.
Edit 1: I have tried the following code:
df=df.transpose()
df.style.format("{:.2%}").format({"VAR1":"{:.2f},"VAR4":"{:.2f}"})
Note: by transposing the dataframe it is much easier to do all tasks but I cannot transpose it back to its original shape because it is styler.
Conditional cell highlighting. One way to conditionally format your Pandas DataFrame is to highlight cells which meet certain conditions. To do so, we can write a simple function and pass that function into the Styler object using . apply() or .
Orient is short for orientation, or, a way to specify how your data is laid out. Method 1 – Orient (default): columns = If you want the keys of your dictionary to be the DataFrame column names. Method 2 – Orient: index = If the keys of your dictionary should be the index values.
I had the same problem and looked into implementation of the format
function in pandas.io.formats.style.Styler
class and implemented a similar row-wise function:
def format_row_wise(styler, formatter):
for row, row_formatter in formatter.items():
row_num = styler.index.get_loc(row)
for col_num in range(len(styler.columns)):
styler._display_funcs[(row_num, col_num)] = row_formatter
return styler
Example:
df = pandas.DataFrame(
{
'Limit': [1.20, 0.82, 0.38, 0.17],
'Status': [1.21216, 0.63075, 0.376988, 0.126987],
'Warning': [1.11, 0.75, 0.35, 0.14],
'3M AVG': [1.21235, 0.593259, 0.376988, 0.12461]
},
index=['VAR1', 'VAR2', 'VAR3', 'VAR4']
)
formatters = {"VAR1":lambda x: f"{x:.2f}", "VAR4": lambda x: f"{x:.2f}"}
styler = format_row_wise(df.style, formatters)
styler.render()
This works for me :)
Note:
Hopefully, this gets you on the right way...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With