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

在Streamlit中实现DataFrame转置列仅高亮最值的条件格式问题

问题与解决方案

执行代码后,转置后的DataFrame出现错误高亮,需求为仅高亮每一列的最大值和最小值。

原代码问题分析

  • 硬编码指定行(E1、E2、E3)的最值,未针对转置后的每一列单独计算
  • 填充空值后将数值与文本混同,导致最值判断逻辑混乱
  • 使用applymap逐个元素判断,未按列维度处理高亮逻辑

修正后的代码

import pandas as pd
import streamlit as st

# 示例数据
data = {
    'E0': ["Header1", "Header2", "Header3", "Header4"],
    'E1': [10, 20, 3, 5],
    'E2': [25, None, 20, 1],
    'E3': [5, 10, 8, None]
}
df = pd.DataFrame(data)

# 转置DataFrame
df_transposed = df.transpose()
custom_text = '未提供'
df_filled = df_transposed.fillna(custom_text)

# 提取数值行(转置后行索引为E1、E2、E3的行,即原数据的数值列)
numeric_rows = df_transposed.loc[['E1', 'E2', 'E3']]

def highlight_cols(col):
    # 初始化样式列表
    styles = [''] * len(col)
    # 获取当前列的数值部分(排除填充的文本)
    col_numeric = col[col != custom_text]
    if not col_numeric.empty:
        col_max = col_numeric.max()
        col_min = col_numeric.min()
        # 遍历列元素,设置高亮样式
        for idx, val in enumerate(col):
            if val == col_max:
                styles[idx] = 'background-color: green; color: white;'
            elif val == col_min:
                styles[idx] = 'background-color: red; color: white;'
    return styles

# 应用样式:按列处理,精准匹配每列最值元素
styled_df = df_filled.style.apply(highlight_cols, axis=0)
st.table(styled_df)

代码说明

  1. 转置后单独提取数值行,避免表头文本干扰最值计算
  2. 按列处理高亮逻辑:对每一列单独计算最大值和最小值,忽略填充的空值文本
  3. 使用apply(..., axis=0)按列遍历,精准匹配每列的最值元素并设置样式
  4. 空值填充文本改为中文“未提供”,适配中文场景需求

内容的提问来源于stack exchange,提问作者The_Napster

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 14:33:22