I have a large dataframe that comes from calculation with varying number of columns and rows:
a b c d e
0 5 1 5 1 4
1 0 3 1 1 5
2 2 5 2 5 1
3 2 3 2 3 4
Each column has last row that decides coloring of each cell in that column. Each cell of the column needs to be compared with the last cell of that particular column and then the condition to be applied is: if s>s[-1]: background-color: green, if s<s[-1]: background-color: red, if s==s[-1]: background-color: yellow.
Therefore I need to highlight all rows except last using the above conditions.
I tried with two conditions but could not get the third condition:
data = [[5,1,5,1,4], [0,3,1,1,5], [2,5,2,5,1],[2,3,2,3,4]]
# Create the pandas DataFrame
df = pd.DataFrame(data, columns=['a','b','c','d','e'])
def highlight_greater(s):
is_max = s > s[-1]
return ['background-color: green' if i else 'background-color: yellow' for i in is_max ]
df.style.apply(highlight_greater)
I don't know how to use three condition using this function. Can some one help?
CodePudding user response:
You can use:
colors = {1: 'green', 0: 'yellow', -1: 'red'}
# mask to leave the last row without style
mask = np.tile(df.index==df.index[-1], (df.shape[1],1)).T
# compute the sign of difference to last row
# and map colors style
style = (np.sign(df.sub(df.iloc[-1])
.mask(mask)
)
.replace(colors)
.radd('background-color: ')
)
# apply style
df.style.apply(lambda x: style, axis=None)
Output:
Used input:
df = pd.DataFrame({'a': [5, 0, 2, 2],
'b': [1, 3, 5, 3],
'c': [5, 1, 2, 2],
'd': [1, 1, 5, 3],
'e': [4, 5, 1, 4]})