如何为Pandas DataFrame按行内参考值设置单元格背景色?
解决方案
要实现每行参考值不同的单元格背景着色,核心是先提取需要对比的数值,再按行生成对比掩码,最后通过Pandas的Styler模块应用样式。
完整代码
import pandas as pd # 示例数据 df = pd.DataFrame({'Reference': ['40%','30%'], 'colA': ['30% (20%)','25% (14%)'], 'colB': ['45% (20%)','25% (30%)'], 'colC': ['25% (30%)','35% (30%)']}) # 1. 提取百分比数值并转为浮点型 def extract_percent(val): # 提取开头的数字部分(括号外的百分比) return float(val.str.extract(r'^(\d+)%')[0]) # 处理参考值列 ref_values = extract_percent(df['Reference']) # 处理需要对比的列(colA/colB/colC) comp_cols = ['colA', 'colB', 'colC'] comp_values = df[comp_cols].apply(extract_percent, axis=1) # 2. 生成对比掩码:提取值 < 参考值时为True(需要标绿) mask = comp_values.lt(ref_values, axis=0) # 3. 定义样式函数 def highlight_cells(styler_df): # 创建空样式矩阵 style_matrix = pd.DataFrame('', index=styler_df.index, columns=styler_df.columns) # 对掩码为True的单元格设置绿色背景 style_matrix[mask] = 'background-color: #90EE90' # 浅绿色更易读 return style_matrix # 应用样式到目标列,保留原数据显示 styled_df = df.style.apply(highlight_cells, axis=None).format(precision=0) # Jupyter环境中直接运行即可看到渲染效果 styled_df
关键步骤说明
- 数值提取:用正则表达式
^(\d+)%匹配每个单元格开头的百分比数字,转为浮点型后才能进行数值对比。 - 按行对比:使用
lt(ref_values, axis=0)让每行的colA-C数值与该行的Reference值逐一对比,生成布尔掩码矩阵。 - 样式应用:通过
Styler.apply将样式矩阵应用到原DataFrame,只给掩码为True的单元格设置绿色背景。
效果匹配
运行后会完全符合预期:
- 第一行:colA(30% < 40%)、colC(25% < 40%)背景为绿色
- 第二行:colA(25% < 30%)、colB(25% < 30%)背景为绿色
内容的提问来源于stack exchange,提问作者Prateek
相关产品推荐
相关产品推荐

