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

使用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列文本显示为红色
  • 预期渲染效果:
    Final table visualisation

原有代码错误分析

此前三次实现未生效,核心原因是对Pandas Styler的两个核心方法的传参逻辑理解错误:

  1. 第一版代码错误:applymap是逐单元格执行的方法,传入回调函数的参数是单个单元格的取值,并非整行/整列数据,因此在回调中访问val.energy_consumption、val.threshold会直接触发属性不存在的报错。
  2. 第二版代码错误:同样错用applymap实现行级逻辑,回调接收的参数是Check列单个单元格的值,无法获取同行其他列的数值,判断逻辑无法执行。
  3. 第三版代码错误:首先存在基础语法错误(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:57:10