如何在pandas中对字符串分类并使用seaborn按类别着色后导出Excel
实现方案
- 第一步:构建字符到分类的映射字典,方便快速查询每个字符所属的分类
- 第二步:生成从红到绿的5阶渐变颜色,对应5个分类的着色需求
- 第三步:编写单元格样式匹配函数,仅对
type为new的列生效 - 第四步:导出带样式的Excel文件
完整可运行代码
import pandas as pd import numpy as np import string import seaborn as sns # 原有生成测试数据的代码 index = pd.MultiIndex.from_product([[2020], [1, 2, 3, 4]], names=['year', 'q']) columns = pd.MultiIndex.from_product([['Items1', 'Items2', 'Items3'], ['new', 'old']], names=['Items', 'type']) np.random.seed(123) data = np.random.choice(list(string.ascii_lowercase), (4,6)) Ldata = pd.DataFrame(data, index=index, columns=columns) # 定义分类规则 category1 = ['a', 'b', 'c', 'd', 'e'] category2 = ['f', 'g', 'h', 'i', 'j', 'k'] category3 = ['l', 'm', 'n', 'o', 'p'] category4 = ['q', 'r', 's', 't', 'u', 'w'] category5 = ['x', 'y', 'z'] # 1. 构建字符到分类编号的映射 cat_map = {} for cat_id, cat_list in enumerate([category1, category2, category3, category4, category5], start=1): for char in cat_list: cat_map[char] = cat_id # 2. 生成红到绿的5阶渐变颜色,也可以手动替换为自定义的hex颜色列表 color_palette = sns.diverging_palette(h_neg=10, h_pos=130, n=5, s=90, l=70).as_hex() # 3. 样式匹配函数 def assign_cell_color(val): # 查询字符所属分类,没有匹配的分类则不添加样式 cat_id = cat_map.get(val) if not cat_id: return "" return f"background-color: {color_palette[cat_id - 1]}" # 4. 仅对第二级列索引为new的列应用样式 styled_df = Ldata.style.applymap( assign_cell_color, subset=(Ldata.index, Ldata.columns[Ldata.columns.get_level_values('type') == 'new']) ) # 导出Excel,需要提前安装依赖:pip install openpyxl styled_df.to_excel("category_colored_output.xlsx", engine="openpyxl", index=True)
自定义颜色说明
如果不需要依赖seaborn生成颜色,可直接替换color_palette为自定义的颜色列表,示例:
color_palette = ['#ff4444', '#ffbb33', '#ffff99', '#99cc00', '#009933']
列表顺序对应category1到category5的颜色,可根据实际视觉需求调整色值。
内容的提问来源于stack exchange,提问作者project.py
相关产品推荐
相关产品推荐

