Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Conditionally format Python pandas cell

Tags:

I am trying to color, highlight, or change fond of Python pandas DataFrame based on the value of the cell. e.g. if the cells on each rows are bigger than the cell in the first column of that row, then highlight the cell as red (or any other color), otherwise leave it as it is.

I wrote a for loop here:

for index in range(0, df.shape[0]):     for column in range(1, df.shape[1]): # from 1 not from 0 because I only need # to compare the 2nd to the last cell of each row with the 1st cell in the row           if df.iloc[index][column] - df_BDE_n_months_avg_std_pct.iloc[index][0] > 0:             then "PLEASE PUT YOUR HELP HERE, I NEED A PIECE OF CODE THAT CAN HIGHLIGHT THE CELL"         else:             "DO NOTHING" 

So far I haven't found a way to do it. Any help will be great.

like image 806
thatMeow Avatar asked Dec 17 '16 23:12

thatMeow


People also ask

How do I use conditional formatting in Pandas?

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 .

How do Pandas color cells?

You can use some of their built-in functions like background_gradient or bar to replicate excel-like features like conditional formatting and data bars. You can also format cells to display percentages, floats, ints, etc. without changing the original dataframe. and call it on my Styler object, i.e., df.


Video Answer


2 Answers

From the style docs:

You can apply conditional formatting, the visual styling of a DataFrame depending on the data within, by using the DataFrame.style property.

import pandas as pd df = pd.DataFrame([[2,3,1], [3,2,2], [2,4,4]], columns=list("ABC"))  df.style.apply(lambda x: ["background: red" if v > x.iloc[0] else "" for v in x], axis = 1) 

enter image description here


Edit: to format specific cells, you can add condition checkers to check the name of element with Series.iteritems() or check the index with enumerate(), e.g. if you want to format starting from column 3, you can use enumerate and check the index:

df = pd.DataFrame([[2,3,-3], [3,2,7], [2,4,4]], columns=list("ABC"))  df.style.apply(lambda x: ["background-color: #ff33aa"                            if (i >= 2 and (v > x.iloc[0] + x.iloc[1]                                            or v < x.iloc[0] - x.iloc[1]))                            else "" for i, v in enumerate(x)], axis = 1) 

enter image description here

like image 95
Psidom Avatar answered Sep 28 '22 04:09

Psidom


import numpy as np import pandas as pd df = pd.DataFrame(np.random.rand(4,3)) df.style.applymap(lambda x: 'background-color : yellow' if x>df.iloc[0,0] else '') 

df

like image 33
Zoe L Avatar answered Sep 28 '22 04:09

Zoe L