I need to add grouped background colors for the header columns based by a value from list of dicts,
The data that contains list of dicts
data = [ { "rank": 2, "keyword": "classic ultraschallreiniger", "volume": null, "asin": "B073WWXTRF", "parent_asin": "B073WW53SR" }, { "rank": 14, "keyword": "classic ultraschallreiniger", "volume": null, "asin": "B073WWXTRF", "parent_asin": "B073WW53SR" }, { "rank": 10, "keyword": "classic ultraschallreiniger", "volume": null, "asin": "B09K7F2YN6", "parent_asin": "B09K7BW5KH" }, { "rank": 22, "keyword": "classic ultraschallreiniger", "volume": null, "asin": "B09K7F2YN6", "parent_asin": "B09K7BW5KH" }, { "rank": 1, "keyword": "classic ultraschallreiniger", "volume": null, "asin": "B08LCB95V8", "parent_asin": "B08LCD86RD" }, { "rank": 13, "keyword": "classic ultraschallreiniger", "volume": null, "asin": "B08LCB95V8", "parent_asin": "B08LCD86RD" }, { "rank": 4, "keyword": "flüssigkeit für ultraschallreiniger", "volume": 500, "asin": "B073WWXTRF", "parent_asin": "B073WW53SR" }, { "rank": 20, "keyword": "flüssigkeit für ultraschallreiniger", "volume": 500, "asin": "B073WWXTRF", "parent_asin": "B073WW53SR" }, { "rank": 6, "keyword": "flüssigkeit für ultraschallreiniger", "volume": 500, "asin": "B09K7F2YN6", "parent_asin": "B09K7BW5KH" }, { "rank": 14, "keyword": "flüssigkeit für ultraschallreiniger", "volume": 500, "asin": "B09K7F2YN6", "parent_asin": "B09K7BW5KH" }, { "rank": 5, "keyword": "flüssigkeit für ultraschallreiniger", "volume": 500, "asin": "B094XZ4T96", "parent_asin": "B09DD2XZBQ" }, ]
function to add some styles
def center(x): px = ["text-align: center" for x in x] return px
To pandas dataframe:
lists = ["asin", "keyword", "volume", "rank"] df_sponsored = pd.DataFrame(data) df_sponsored = df_sponsored.drop_duplicates( subset=["asin", "keyword"], keep="first" ) if df_sponsored: df_sponsored[lists] = df_sponsored[lists].fillna(0) df_sponsored = df_sponsored.assign( rank=df_sponsored["rank"].astype(str) ).pivot_table( index=["keyword", "volume"], columns=["parent_asin", "asin"], values="rank", aggfunc="min", fill_value=0, # margins=True, # margins_name="Best_ranking", ) writer = pd.ExcelWriter(f"{path}/sheet.xlsx", engine="xlsxwriter") df_sponsored.style.apply(center, axis=1).to_excel( writer, sheet_name="Sponsored", index=True, startrow=0, header=True ) for column in df_sponsored: column_length = 40 col_idx = df_sponsored.columns.get_loc(column) writer.sheets["Sponsored"].set_column(col_idx, 100, column_length) writer.save()
What I am trying to accomplish is to add random background color to parent_asin and asin group by parent_asin
How to add random background colors based on parent_asin
?
or lets say, if I update the data so it will contain key called color?
data = [ { "rank": 6, "keyword": "flüssigkeit für ultraschallreiniger", "volume": 500, "asin": "B09K7F2YN6", "parent_asin": "B09K7BW5KH", "color": "blue", }, { "rank": 14, "keyword": "flüssigkeit für ultraschallreiniger", "volume": 500, "asin": "B09K7F2YN6", "parent_asin": "B09K7BW5KH", "color": "green" },
no color
This is the output I need
Any help is appreciated
Thanks
Advertisement
Answer
import random df_sponsored.style.apply(center, axis=1).to_excel( writer, sheet_name="Sponsored", index=True, startrow=0, header=True ) for column in df_sponsored: column_length = 40 col_idx = df_sponsored.columns.get_loc(column) writer.sheets["Sponsored"].set_column(col_idx, 100, column_length)
Defining the functions for highlight and center the column headers and randomized colors:
def highlight_center(st, colors): return [f"background-color: {colors[v]}; text-align: center;" for v in st] def random_color(): return ["#"+''.join([random.choice('ABCDEF0123456789') for i in range(6)])][0] s = df_sponsored.style
creating the color_map dictionary:
color_map = {} for parent, child in df_sponsored.columns: color = color_map.setdefault(parent, random_color()) color_map[child] = color
applying the colors with lambda to the columns header (axis=1):
s.apply_index(lambda x: highlight_center(x, color_map), axis=1, level=[0, 1]).to_excel( writer, sheet_name="Sponsored" ) writer.save()
output