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
相关产品推荐
相关产品推荐

