Streamlit Web应用报错:TypeError: Object of type int64 is not JSON serializable
解决Streamlit中DataFrame的int64 JSON序列化错误
问题分析
你的代码在本地Python控制台运行正常,但在Streamlit里抛出TypeError: Object of type int64 is not JSON serializable,核心原因:
- Streamlit渲染
st.dataframe时需要将数据序列化为JSON格式,但pandas默认使用的numpy原生数值类型(如numpy.int64、numpy.float64)不在JSON标准可序列化范围内。 - 循环赋值生成的年月列中,大部分行是缺失值(NaN),导致原本的int类型列被强制转为float类型,进一步加剧了序列化冲突;即使手动修改列类型,也可能因为隐藏的numpy类型残留或缺失值处理不当而失效。
修复方案
方案1:用透视表替代循环(推荐,更高效且类型可控)
循环生成年月列的方式不仅低效,还容易引入类型问题,改用pandas透视表可直接生成目标宽表,同时自动处理类型:
def store_AG(merged_df): # 拷贝原数据,避免修改原DataFrame forecast_df = merged_df.copy() forecast_df['day(yyyy-mm-dd)'] = pd.to_datetime(forecast_df['day(yyyy-mm-dd)']) # 生成"月份 年份"格式的标签列 forecast_df['year_month_label'] = forecast_df['day(yyyy-mm-dd)'].dt.strftime('%B %Y') # 透视表生成宽表:按行保留原数据,列转为年月,值为对应revenue pivot_result = forecast_df.pivot(columns='year_month_label', values='revenue') # 合并回原数据框 forecast_df = pd.concat([forecast_df, pivot_result], axis=1) # 转换为Streamlit可序列化的Nullable类型(支持缺失值) forecast_df = forecast_df.convert_dtypes() st.dataframe(forecast_df)
方案2:修复原循环的类型问题
如果坚持使用原循环逻辑,需在展示前强制转换所有数值列为Python原生类型:
import numpy as np def store_AG(merged_df): forecast_df = merged_df.copy() # 必须拷贝,避免修改原数据 forecast_df['day(yyyy-mm-dd)'] = pd.to_datetime(forecast_df['day(yyyy-mm-dd)']) min_year = forecast_df['day(yyyy-mm-dd)'].dt.year.min() max_year = forecast_df['day(yyyy-mm-dd)'].dt.year.max() for year in range(min_year, max_year + 1): for month in range(1, 13): month_name = pd.to_datetime(str(month), format='%m').strftime('%B') col_name = f"{month_name} {year}" # 用np.where赋值,使用pandas原生缺失值避免强制转float forecast_df[col_name] = np.where( (forecast_df['day(yyyy-mm-dd)'].dt.month == month) & (forecast_df['day(yyyy-mm-dd)'].dt.year == year), forecast_df['revenue'], pd.NA ) # 转换所有列为可序列化的类型 forecast_df = forecast_df.convert_dtypes() st.dataframe(forecast_df)
关键说明
convert_dtypes():pandas的这个方法会将numpy原生类型转为支持缺失值的Nullable类型(如Int64、Float64),这些类型能被Streamlit正确序列化。- 必须拷贝原DataFrame:直接引用
forecast_df = merged_df会继承原数据的类型问题,导致修改无效。
内容的提问来源于stack exchange,提问作者Junaid Ahmed
相关产品推荐
相关产品推荐

