如何在Streamlit的st.dataframe()/st.table()中隐藏<NA>(NaN)值?
解决Streamlit中DataFrame的显示问题
当使用st.dataframe()或st.table()展示Pandas DataFrame时,NaN值会显示为<NA>,以下几种方法可以隐藏这些值,同时保留上下文行、保持数值右对齐并固定精度:
方案一:使用Pandas Styler自定义显示格式(推荐)
这种方法无需修改原始DataFrame的数值类型,通过Styler自定义单元格显示规则,既实现NaN为空显示,又能固定数值精度,且数值自动右对齐。
import pandas as pd import streamlit as st df = pd.read_csv("nlp_metrics_v2.csv", header=0) # 定义格式化规则:数值保留两位小数,NaN显示为空 def format_cell(val): if pd.isna(val): return "" elif isinstance(val, (int, float)): return f"{val:.2f}" return val # 应用样式到DataFrame styled_df = df.style.format(format_cell) st.dataframe(styled_df)
方案二:替换NaN为空字符串并格式化数值
如果接受将数值转为字符串,可直接对数值列格式化后替换NaN为空,实现空单元格效果。
import pandas as pd import streamlit as st df = pd.read_csv("nlp_metrics_v2.csv", header=0) # 筛选数值列,保留两位小数后转为字符串,NaN替换为空 numeric_cols = df.select_dtypes(include=[float, int]).columns df[numeric_cols] = df[numeric_cols].applymap(lambda x: f"{x:.2f}" if not pd.isna(x) else "") # 替换剩余的非数值列NaN为空 df = df.fillna("") st.dataframe(df)
方案三:通过自定义CSS隐藏文本
无需修改DataFrame结构,利用Streamlit的自定义CSS隐藏表格中的<NA>文本,同时保留数值的原始类型和格式。
import pandas as pd import streamlit as st # 注入自定义CSS,隐藏包含<NA>的单元格文本 st.markdown(""" <style> [data-testid="stDataFrame"] .row-cell div:contains("<NA>") { visibility: hidden; } </style> """, unsafe_allow_html=True) df = pd.read_csv("nlp_metrics_v2.csv", header=0) # 对数值列保留两位小数 numeric_cols = df.select_dtypes(include=[float, int]).columns df[numeric_cols] = df[numeric_cols].round(2) st.dataframe(df)
说明
- 三种方案均不会删除上下文行,仅隐藏NaN的显示内容;
- 方案一和方案三可保留数值类型,适合后续仍需使用数据计算的场景;
- 方案二实现简单,但数值会转为字符串,仅适合纯展示需求。
内容的提问来源于stack exchange,提问作者Joel Sullivan
相关产品推荐
相关产品推荐

