使用pandas styler基于同数据框另一列值修改列文本颜色(适配Streamlit)
Streamlit DataFrame跨列条件设置文本颜色实现方案
需求说明
在Streamlit应用中渲染Pandas DataFrame表格时,需基于同行其他列的取值,对Check列的文本设置条件颜色:
- 目标DataFrame共包含5列,列名依次为:
energy_kwh、energy_cumsum_kwh、threshold、energy_consumption、Check - 颜色规则:
- 当同一行
threshold列数值大于energy_consumption列数值时,该行Check列文本显示为绿色 - 当同一行
energy_consumption列数值大于threshold列数值时,该行Check列文本显示为红色
- 当同一行
- 预期渲染效果:

原有代码错误分析
此前三次实现未生效,核心原因是对Pandas Styler的两个核心方法的传参逻辑理解错误:
- 第一版代码错误:
applymap是逐单元格执行的方法,传入回调函数的参数是单个单元格的取值,并非整行/整列数据,因此在回调中访问val.energy_consumption、val.threshold会直接触发属性不存在的报错。 - 第二版代码错误:同样错用
applymap实现行级逻辑,回调接收的参数是Check列单个单元格的值,无法获取同行其他列的数值,判断逻辑无法执行。 - 第三版代码错误:首先存在基础语法错误(if分支重复写了else条件),其次
subset参数传递位置错误(应传入Styler构造方法而非Streamlit渲染方法),同时目标样式列错选为energy_kwh,和需求要修改的Check列完全不匹配。
可直接运行的正确代码
跨列判断的行级样式不能使用逐单元格操作的applymap,需要使用apply方法并指定axis=1,让回调接收整行数据做判断,最终返回整行的样式数组,仅给Check列设置对应颜色即可。
import streamlit as st import pandas as pd # 替换为实际的DataFrame数据读取/生成逻辑 # df = pd.DataFrame(...) def set_check_color(row): # 初始化行内所有单元格样式为空 style_array = [''] * len(row) # 定位Check列的索引 check_pos = row.index.get_loc('Check') # 按条件设置颜色 if row['energy_consumption'] > row['threshold']: style_array[check_pos] = 'color: red' elif row['threshold'] > row['energy_consumption']: style_array[check_pos] = 'color: green' return style_array # 构造带样式的DataFrame styled_df = df.style.apply(set_check_color, axis=1) # Streamlit渲染 st.dataframe(styled_df)
补充说明:两列数值相等的场景默认不设置特殊颜色,可根据业务需求自行补充对应分支的样式规则。该方案兼容所有支持Pandas Styler的Streamlit版本,无需额外依赖。
内容的提问来源于stack exchange,提问作者MOT
相关产品推荐
相关产品推荐

