Reputation: 579
I have been trying to write a function to use with pandas style
. I want to highlight specific columns that I specify in the arguments. This is not very elegant, but for example:
data = pd.DataFrame(np.random.randn(5, 3), columns=list('ABC'))
def highlight_cols(df, cols, colcolor = 'gray'):
for col in cols:
for dfcol in df.columns:
if col == cols:
color = colcolor
return ['background-color: %s' % color]*df.shape[0]
then call with:
data.style.apply(highlight_cols(cols=['B','C']))
I get an error:
'Series' object has no attribute 'columns'
I think I fundamentally don't quite understand how the styler calls and apply
ies the function.
Upvotes: 35
Views: 66727
Reputation: 17911
You can use the method style.set_properties
:
df = pd.DataFrame({'A': [1, 2], 'B': [3, 4], 'C': [5, 6]})
df.style.set_properties(subset=['A', 'C'], **{'background-color': 'green'})
Result:
Upvotes: 5
Reputation: 210972
You can do it bit more dynamically:
data = pd.DataFrame(np.random.randn(5, 3), columns=list('ABC'))
# dictionary of column colors
coldict = {'A':'grey', 'C':'yellow'}
def highlight_cols(s, coldict):
if s.name in coldict.keys():
return ['background-color: {}'.format(coldict[s.name])] * len(s)
return [''] * len(s)
data.style.apply(highlight_cols, coldict=coldict)
Upvotes: 28
Reputation: 863531
I think you can use Slicing in Styles
for select columns B
and C
and then Styler.applymap
for elementwise styles.
import pandas as pd
import numpy as np
data = pd.DataFrame(np.random.randn(5, 3), columns=list('ABC'))
#print (data)
def highlight_cols(s):
color = 'grey'
return 'background-color: %s' % color
data.style.applymap(highlight_cols, subset=pd.IndexSlice[:, ['B', 'C']])
If you want more colors or be more flexible, use Styler.apply(func, axis=None)
, the function must return a DataFrame
with the same index and column labels:
import pandas as pd
import numpy as np
data = pd.DataFrame(np.random.randn(5, 3), columns=list('ABC'))
#print (data)
def highlight_cols(x):
#copy df to new - original data are not changed
df = x.copy()
#select all values to default value - red color
df.loc[:,:] = 'background-color: red'
#overwrite values grey color
df[['B','C']] = 'background-color: grey'
#return color df
return df
data.style.apply(highlight_cols, axis=None)
Upvotes: 53