5

enter image description here

How to style the pandas dataframe as an excel table (alternate row colour)?

Sample style:

enter image description here

Sample data:

import pandas as pd
import seaborn as sns

df = sns.load_dataset("tips")
tdy
  • 36,675
  • 19
  • 86
  • 83
Ailurophile
  • 2,552
  • 7
  • 21
  • 46
  • 1
    use `df.style.apply` some function returning an alternate array `['background-color: red', 'background-color: blue',....]` – Quang Hoang Mar 28 '22 at 16:32

1 Answers1

10

If your final goal is to save to_excel, the only way to retain the styling after export is using the apply-based methods:

For the given sample, use df.style.apply to style each column with alternating row colors and df.style.applymap_index to style all row/col indexes:

css_alt_rows = 'background-color: powderblue; color: black;'
css_indexes = 'background-color: steelblue; color: white;'

(df.style.apply(lambda col: np.where(col.index % 2, css_alt_rows, None)) # alternating rows
         .applymap_index(lambda _: css_indexes, axis=0) # row indexes (pandas 1.4.0+)
         .applymap_index(lambda _: css_indexes, axis=1) # col indexes (pandas 1.4.0+)
).to_excel('styled.xlsx', engine='openpyxl')


If you only care about the appearance in Jupyter, another option is to set properties for targeted selectors using df.style.set_table_styles (requires pandas 1.2.0+):

# pandas 1.2.0+
df.style.set_table_styles([
    {'selector': 'tr:nth-child(even)', 'props': css_alt_rows},
    {'selector': 'th', 'props': css_indexes},
])
tdy
  • 36,675
  • 19
  • 86
  • 83