Search code examples
pythonpandasdataframestyles

How to style my dataframe by column with conditions?


I want to paint the share price cell green if it is higher than the target price and red if it is lower than the alert price and my code is not working as it keeps popping errors.

This is the code that I use

temp_df.style.apply(lambda x: ["background: red" if v < x.iloc[:,1:] and x.iloc[:,1:] != 0 else "" for v in x], subset=['Share Price'], axis = 0)

temp_df.style.apply(lambda x: ["background: green" if v > x.iloc[:,2:] and x.iloc[:,2:] != 0 else "" for v in x], subset=['Share Price'], axis = 0)

Can anyone give me an idea on how to do it?

Index Share Price Alert/Entry   Target
0   622.0   424.0   950.0
1   6880.0  5200.0  7450.0
2   62860.0 40000.0 60000.0
3   7669.0  5500.0  8000.0
4   5295.0  3500.0  5500.0
5   227.0   165.0   250.0
6   3970.0  3200.0  4250.0
7   1300.0  850.0   1650.0
8   8480.0  6500.0  8500.0
9   11.3    0.0 0.0
10  66.0    58.0    75.0
11  7.3 6.4 9.6
12  114.8   75.0    130.0
13  172.3   90.0    0.0
14  2.6 2.4 3.2
15  76.8    68.0    85.0
16  19.6    15.4    21.0
17  21.9    11.0    18.6
18  35.4    29.0    42.0
19  12.5    9.2 0.0
20  15.5    0.0 0.0
21  449.8   0.0 0.0
22  4.3 3.6 5.0
23  47.4    40.0    55.0
24  0.6 0.5 0.6
25  49.2    45.0    72.0
26  13.9    0.0 0.0
27  3.0 2.4 4.5
28  2.4 1.8 4.2
29  54.0    0.0 0.0
30  293.5   100.0   250.0
31  190000.0    140000.0    220000.0
32  52200.0 46000.0 58000.0
33  100500.0    75000.0 115000.0
34  4.9 3.8 6.5
35  0.2 0.0 0.0
36  1430.0  980.0   1450.0
37  1585.0  0.0 0.0
38  15.6    11.0    18.0
39  3.3 2.8 6.0
40  52.5    45.0    68.0
41  46.5    35.0    0.0
42  193.6   135.0   0.0
43  122.8   90.0    0.0
44  222.6   165.0   265.0

Solution

  • Provided that "Index" is also a column:

    temp_df.style.apply(lambda x: ["background: green" if (i==1 and v > x.iloc[3] and x.iloc[3] != 0) else ("background: red" if (i==1 and v < x.iloc[2]) else "") for i, v in enumerate(x)], axis=1)
    

    i: aims to define the column Share Price to be styled (column: 1)