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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 12:24:57