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

如何在Streamlit中隐藏Styler DataFrame用于高亮的anomaly列?

问题解决:Streamlit中高亮异常行后隐藏'anomaly'列

问题说明

在Streamlit应用里,想用df.style.apply通过'anomaly'列标记并高亮异常行,之后隐藏该列避免干扰干扰,但尝试多种方法都没达到预期效果,当前代码如下:

def anomaly_highlight(row):
    """Highlight a row in a dataframe according to a condition"""
    color = "#80003A" if row['anomaly'] == True else ''
    return [f'background-color:{color};'] * len(row)

df = pd.read_csv(upload)

model = IsolationForest(n_estimators=estimator, contamination=contamination,
                            max_samples='auto')

model.fit(df[keep_col])
df['anomaly'] = model.predict(df[keep_col]) == -1

df = df.style.apply(anomaly_highlight, axis=1)
# df_display = df.data.drop('anomaly', axis=1)
df = df.hide_columns('anomaly')

问题原因

代码逻辑方向没问题,但需注意:df.style.apply返回的是Styler样式对象而非原始DataFrame,不能通过修改原始数据的方式去删列(会丢失已设置的样式),且需要在Streamlit中正确渲染这个Styler对象才能生效。

修正后的代码

import pandas as pd
from sklearn.ensemble import IsolationForest
import streamlit as st

def anomaly_highlight(row):
    """根据条件高亮DataFrame行"""
    color = "#80003A" if row['anomaly'] else ''
    return [f'background-color:{color};'] * len(row)

# 读取上传文件
df = pd.read_csv(upload)

# 训练模型并标记异常
model = IsolationForest(n_estimators=estimator, contamination=contamination, max_samples='auto')
model.fit(df[keep_col])
df['anomaly'] = model.predict(df[keep_col]) == -1

# 应用高亮样式并隐藏'anomaly'列
styled_df = df.style.apply(anomaly_highlight, axis=1).hide_columns('anomaly')

# 在Streamlit中渲染带样式的表格
st.dataframe(styled_df)

关键注意点

  • 必须保留'anomaly'列直到样式应用完成,因为高亮逻辑完全依赖该列的判断结果
  • 直接对Styler对象调用hide_columns('anomaly')即可,无需修改原始DataFrame
  • Streamlit的st.dataframe支持直接渲染Styler对象,能正常显示带高亮且隐藏指定列的表格

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 10:02:38