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

Streamlit数据预处理应用下载处理后DataFrame报RuntimeError如何解决

问题解决方法

报错根因

  • Streamlit的st.download_button组件的data参数仅支持字符串、字节流、类文件对象三种格式,你直接传入了Pandas的DataFrame对象,因此触发类型不兼容报错。
  • 原有代码中result.to_csv(index=False)调用后没有接收返回值:当to_csv()方法不传入本地保存路径时,会直接返回CSV格式的字符串,你之前忽略了这个返回值,仍然将DataFrame对象传入下载组件。
  • 额外逻辑问题:原有export_data函数固定调用mvt_mean处理数据,不管用户选择的是中位数/众数插补,会导致下载结果和页面展示结果不一致。

修复方案

第一步:优化路径拼接逻辑

原有硬编码的Windows路径分隔符\\在Mac/Linux环境下无法运行,改用os.path.join做跨平台适配:

# 替换原有路径拼接代码
temp = 'temp.csv'
path = os.path.join(os.getcwd(), temp)

第二步:修改export_data函数,支持传入预处理后的结果

# 修改后的export_data函数
def export_data(processed_df):
    # 直接将传入的预处理后DataFrame转为CSV字符串
    csv_data = processed_df.to_csv(index=False)
    st.sidebar.download_button(
        label='Download CSV',
        data=csv_data,
        mime='text/csv',
        file_name='Download.csv'
    )
    return

第三步:修改调用逻辑,将预处理后的结果传入export_data

# 对应选择插补方式的分支修改为:
if opt=='Mean':
    processed_df = mvt_mean(df)
    export_data(processed_df)
elif opt=='Median':
    processed_df = mvt_median(df)
    export_data(processed_df)
elif opt=='Mode':
    processed_df = mvt_mode(df)
    export_data(processed_df)

完整修复后代码

import streamlit as st
import pandas as pd
import os
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

# 优化路径拼接,适配跨平台运行
temp = 'temp.csv'
path = os.path.join(os.getcwd(), temp)

def upload_csv(zxc):
    if zxc:
        df=pd.read_csv(zxc)
        st.dataframe(df)
        df.to_csv(path,index=False)
        return df
    

def upload_xlsx(zxc):
    if zxc:
        df=pd.read_excel(zxc)
        st.dataframe(df)
        df.to_csv(path,index=False)
        return df

def mvt_mean(df):
    new_df=df.fillna(df.mean(numeric_only=True))
    new_df=new_df.fillna(df.select_dtypes(include='object').mode().iloc[0])
    st.dataframe(new_df)
    return new_df


def mvt_median(df):
    new_df=df.fillna(df.median(numeric_only=True))
    new_df=new_df.fillna(df.select_dtypes(include='object').mode().iloc[0])
    st.dataframe(new_df)
    return new_df

def mvt_mode(df):
    new_df=df.fillna(df.select_dtypes(include='object').mode().iloc[0])
    st.dataframe(new_df)
    return new_df

# 修改后的export_data函数,接收预处理后的DataFrame作为参数
def export_data(processed_df):
    csv_data = processed_df.to_csv(index=False)
    st.sidebar.download_button(
        label='Download CSV',
        data=csv_data,
        mime='text/csv',
        file_name='Download.csv'
    )
    return


st.title('Hello Streamlit Front end for Python ')
option = st.sidebar.selectbox('DSA Application',('Data-PreProcessing', 'Data-Visualization', 'Machine-Learning'))
st.sidebar.write('You selected:', option)
if option=='Data-PreProcessing':
    format_options=['csv','xlsx']
    a=st.sidebar.radio('Choose the file type',format_options)
    if a=='csv':
        b=st.sidebar.file_uploader("Choose a file",type='csv')
        if b :
            if st.sidebar.checkbox('Upload File'):
                df=upload_csv(b)
                opt=st.sidebar.radio('Impute Missing Value using',('Mean','Median','Mode'))
                st.sidebar.write('You selected',opt)
                if opt=='Mean':
                    processed_df = mvt_mean(df)
                    export_data(processed_df)
                elif opt=='Median':
                    processed_df = mvt_median(df)
                    export_data(processed_df)
                elif opt=='Mode':
                    processed_df = mvt_mode(df)
                    export_data(processed_df)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:48:03