Python Streamlit中解包DataFrame列表时数据结构变形问题
解决Streamlit多文件上传后DataFrame形状丢失的问题
问题根源
- 错误的解包方式:调用函数时使用
*all_dfs = user_selection(...)是冗余且错误的写法。函数本身返回的是DataFrame列表,直接赋值即可,多余的*会破坏原有列表结构,导致后续索引访问时出现数据异常。 - 冗余的DataFrame清空操作:函数内的
mydf = mydf.iloc[0:0]完全没必要,每次循环都会通过pd.read_csv生成新的DataFrame覆盖mydf,这行代码不仅无效,还可能引发不必要的混淆。
修正后的代码
上传函数代码
import streamlit as st import pandas as pd def user_selection(action): operation_mode = action with st.sidebar: if operation_mode == 'Multiple_files': uploaded_files = st.file_uploader("Choose required files", accept_multiple_files=True) all_df_list = [] for uploaded_file in uploaded_files: # 直接读取CSV文件,无需提前清空DataFrame mydf = pd.read_csv(uploaded_file) all_df_list.append(mydf) return all_df_list
调用代码
all_dfs = user_selection('Multiple_files') # 增加非空判断,避免索引越界报错 if all_dfs: st.write(all_dfs[0]) # 此时DataFrame会保持原有形状与格式
额外优化建议
可以添加文件读取异常处理,提升用户体验:
import streamlit as st import pandas as pd def user_selection(action): operation_mode = action with st.sidebar: if operation_mode == 'Multiple_files': uploaded_files = st.file_uploader("Choose required files", accept_multiple_files=True) all_df_list = [] for uploaded_file in uploaded_files: try: mydf = pd.read_csv(uploaded_file) all_df_list.append(mydf) except Exception as e: st.error(f"读取文件 {uploaded_file.name} 失败: {str(e)}") return all_df_list
内容的提问来源于stack exchange,提问作者Sri2110
相关产品推荐
相关产品推荐

