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

如何高效对Streamlit DataFrame中的数据进行取整?

解决Streamlit中DataFrame高效取整展示的问题

问题背景

  • 数据规模:6万行×43列的DataFrame
  • 核心痛点:
    • 直接调用st.dataframe(data)加载速度快,但浮点型列会显示多余尾随零
    • 使用data.style.set_precision(2)会导致应用完全卡顿,即使仅展示前1000行,速度也远慢于原生展示
    • 通过.round(decimals=2)处理后,展示时仍出现四位小数(如28.0000)
  • 环境版本:Streamlit 1.17.0、NumPy 1.24.2、Pandas 1.5.3

推荐解决方案:Streamlit原生列配置(性能最优)

利用Streamlit的column_config参数在展示层直接设置数值列的小数格式,无需修改原始数据,完全保留原生渲染的高效性。

代码示例:

import streamlit as st
import pandas as pd
import numpy as np

# 加载并筛选数据(你的原有逻辑)
cols = [...]  # 替换为你的列列表
data = data[cols]

# 生成数值列的展示配置
column_config = {}
numeric_cols = data.select_dtypes(include=np.number).columns
for col in numeric_cols:
    column_config[col] = st.column_config.NumberColumn(
        label=col,
        format="%.2f"  # 指定两位小数格式
    )

# 高效展示格式化后的数据
st.dataframe(data, column_config=column_config, use_container_width=True)

备选方案:修改DataFrame数据类型

若需从数据层面确保数值精度,可通过以下两种方式处理:

方式1:转换为Decimal类型

import pandas as pd
import numpy as np
from decimal import Decimal, ROUND_HALF_UP

data = data[cols]
numeric_cols = data.select_dtypes(include=np.number).columns

roundf = data.copy()
# 对数值列保留两位小数,四舍五入
roundf[numeric_cols] = roundf[numeric_cols].applymap(
    lambda x: Decimal(str(x)).quantize(Decimal('0.00'), rounding=ROUND_HALF_UP)
)

st.dataframe(roundf)

方式2:设置Pandas显示精度

import pandas as pd
import numpy as np

data = data[cols]
numeric_cols = data.select_dtypes(include=np.number).columns

# 设置Pandas全局显示精度为2位
pd.set_option('display.precision', 2)
roundf = data.copy()
roundf[numeric_cols] = roundf[numeric_cols].round(2)

st.dataframe(roundf)

避坑提示

Pandas的Styler对象是通过生成HTML表格实现样式控制,对于大规模数据来说HTML渲染开销极大,这是卡顿的核心原因,绝对不要使用st.dataframe(data.style.set_precision(2))处理大规模数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 15:55:38