You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Pandas DataFrame中每个不同值分配唯一颜色(运行时未知值场景)

为Pandas DataFrame动态分配唯一单元格颜色(按值区分)

我们需要实现:对运行前值未知的Pandas DataFrame,为每个唯一值分配专属颜色,且相同值的单元格颜色完全一致。比如示例中的Bob出现在两个单元格中,它们会被渲染成同一种颜色,而Alice、John、123、456则各用不同颜色。

核心思路

  • 提取DataFrame中所有单元格的唯一值
  • 为每个唯一值映射一个唯一颜色
  • 定义样式函数,根据单元格值返回对应背景色样式
  • 将样式应用到DataFrame上

具体实现代码

方案一:基于Matplotlib颜色映射(推荐,颜色无重复)

利用成熟的离散颜色映射表,确保颜色不重复、视觉区分度高:

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.colors import rgb2hex

# 示例DataFrame(运行前值未知的场景同样适用)
df = pd.DataFrame(data={"A": ["Alice", "Bob"], "B": ["Bob", "John"], "C": [123, 456]})

# 1. 获取所有单元格的唯一值
unique_values = df.stack().unique()

# 2. 为每个唯一值分配专属颜色(使用tab10离散色卡)
color_palette = plt.cm.tab10
value_to_color = {
    val: rgb2hex(color_palette(i / len(unique_values))[:3]) 
    for i, val in enumerate(unique_values)
}

# 3. 定义单元格样式函数
def color_cell(val):
    # 若值不在映射中(理论上不会出现),默认白色背景
    bg_color = value_to_color.get(val, "#ffffff")
    return f"background-color: {bg_color}"

# 4. 应用样式并渲染
styled_df = df.style.applymap(color_cell)
# Jupyter环境中直接运行即可显示,或保存为HTML:styled_df.to_html("colored_df.html")
styled_df

方案二:随机生成颜色(轻量,极小概率重复)

如果不想依赖Matplotlib,可使用随机十六进制颜色,适合对颜色唯一性要求不严格的场景:

import pandas as pd
import random

df = pd.DataFrame(data={"A": ["Alice", "Bob"], "B": ["Bob", "John"], "C": [123, 456]})

# 生成随机十六进制颜色
def get_random_color():
    return f"#{random.randint(0, 0xFFFFFF):06x}"

# 构建值-颜色映射
unique_values = df.stack().unique()
value_to_color = {val: get_random_color() for val in unique_values}

# 样式函数与应用同方案一
def color_cell(val):
    bg_color = value_to_color.get(val, "#ffffff")
    return f"background-color: {bg_color}"

styled_df = df.style.applymap(color_cell)
styled_df

关键说明

  • df.stack():将DataFrame转为一维Series,一次性提取所有单元格的唯一值,适配任意行列结构的DataFrame
  • 颜色扩展:方案一中的tab10包含10种颜色,若唯一值超过10个,可换用tab20等更多颜色的内置色卡
  • 类型兼容:支持所有可哈希值类型(字符串、数字、布尔值等),完全适配运行前值未知的场景

内容的提问来源于stack exchange,提问作者K. Claesson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 03:20:30