如何高效对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
相关产品推荐
相关产品推荐

