Streamlit调用Pandas describe(include='all')报类型转换异常问题
问题根因
这个报错和pandas.DataFrame.describe()的逻辑没有关系,是Streamlit渲染表格环节的类型转换规则导致的:
- 调用
describe(include='all')生成的统计表中,Order ID这类文本列会同时包含数值类统计结果(计数count、去重数unique、频次freq)和字符串类统计结果(最高频取值top,也就是报错里的CA-2018-100111这类订单号),整列是混合类型的object格式 - 1.20.0版本之前的Streamlit默认用Apache Arrow做表格数据序列化传输,会尝试自动把object类型的列统一转换为数值类型,碰到列里的字符串值就会触发你看到的类型转换异常
- 脱离Streamlit直接运行Pandas代码不会报错,是因为Pandas原生输出不需要做统一类型的序列化处理,混合类型列可以正常打印,不会触发强制类型转换逻辑。
可直接用的修复方案
按实现成本从低到高选择即可:
- 最简单的绕路方案:把describe生成的结果表统一转为字符串类型再传给
st.write,直接跳过Arrow的自动类型推断逻辑st.write(superstore_data.describe(include='all').astype(str)) - 长期最优方案:把本地Streamlit升级到1.20.0及以上版本,新版本已经修复了混合类型列的序列化兼容问题,不需要加任何额外处理,原代码就能正常运行。
- 不想升级版本的适配方案:用
st.dataframe替代st.write渲染表格,开启内置的混合类型自动转字符串配置st.dataframe( superstore_data.describe(include='all'), convert_mixed_types_to_str=True )
内容的提问来源于stack exchange,提问作者Muhammad Hafidz Alfarizi
相关产品推荐
相关产品推荐

