如何根据条件为pandas DataFrame的数值设置单元格颜色
DataFrame差异检测及颜色标记实现方案
实现逻辑
- 先调用自定义
equalize_length、equalize_width、equalize函数对齐两个待比对DataFrame的行列维度,将所有缺失值统一填充为字符串"nan",避免原生NaN值无法通过等值判断导致的逻辑错误 - 逐单元格比对对齐后的两个DataFrame,存在差异的单元格内容格式化为
原值 --> 新值,无差异单元格留空,结果存入DataFramea - 基于差异字符串拆分出原值、新值,按三类规则匹配对应背景色,替代容易报错的直接
np.select类型判断逻辑 - 原值为
nan(新增单元格内容)标记绿色,新值为nan(删除单元格内容)标记红色,双方均非nan(值修改)标记黄色
可复用代码
import pandas as pd import numpy as np # 此处可替换为你自行实现的equalize系列对齐函数 def equalize(df1, df2): # 统一对齐行索引 common_index = df1.index.union(df2.index) df1 = df1.reindex(common_index) df2 = df2.reindex(common_index) # 统一对齐列 common_cols = df1.columns.union(df2.columns) df1 = df1.reindex(columns=common_cols) df2 = df2.reindex(columns=common_cols) # 所有缺失值填充为字符串"nan",规避原生NaN判断异常 return df1.fillna("nan"), df2.fillna("nan") # ========== 以下为差异生成+颜色标记逻辑 ========== # 1. 对齐两个待比对DataFrame,替换为你自己的两个原始DataFrame即可 df_old, df_new = equalize(待比对的原始DataFrame1, 待比对的原始DataFrame2) # 2. 生成差异结果表a a = pd.DataFrame(index=df_old.index, columns=df_old.columns, dtype="object") for r in a.index: for c in a.columns: o = df_old.loc[r, c] n = df_new.loc[r, c] a.loc[r, c] = f"{o} --> {n}" if o != n else "" # 3. 按规则设置单元格颜色 def set_cell_color(cell_val): if not cell_val: return "" old_v, new_v = cell_val.split(" --> ") if old_v == "nan": return "background-color: #2ecc71; color: #fff;" # 新增内容绿色 if new_v == "nan": return "background-color: #e74c3c; color: #fff;" # 删除内容红色 return "background-color: #f1c40f; color: #000;" # 修改内容黄色 # 应用样式得到最终带颜色的结果 # pandas 2.1.0以下版本用applymap,以上版本可直接替换为map styled_result = a.style.applymap(set_cell_color)
之前np.select报错的核心原因
- 未将缺失值统一转换为字符串
"nan",原生np.nan不满足np.nan == np.nan的等值判断,会导致np.select的条件矩阵出现异常空值 - 直接对未拆分的
原值 --> 新值字符串做原值/新值的空判断,会触发类型不匹配错误 - 若必须使用
np.select,需提前拆分所有单元格的原值、新值生成三个独立的布尔矩阵,再传入条件列表,不能在np.select的条件参数里写嵌套的拆分、判断逻辑
内容的提问来源于stack exchange,提问作者HelpMeCode
相关产品推荐
相关产品推荐

