在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)
代码说明
- 转置后单独提取数值行,避免表头文本干扰最值计算
- 按列处理高亮逻辑:对每一列单独计算最大值和最小值,忽略填充的空值文本
- 使用
apply(..., axis=0)按列遍历,精准匹配每列的最值元素并设置样式 - 空值填充文本改为中文“未提供”,适配中文场景需求
内容的提问来源于stack exchange,提问作者The_Napster
相关产品推荐
相关产品推荐

