如何对DataFrame中的唯一值进行分类分组?基于Kaggle学生成绩数据集实现Streamlit表单自动关联功能
我来帮你一步步解决这两个需求——先搞定DataFrame的唯一值分类分组,再实现Streamlit表单的联动效果!
一、用Python对DataFrame的唯一值进行分类分组
首先我们用Pandas来处理数据集,构建一个「学校-对应信息」的映射结构,这样后续Streamlit可以直接调用这个结构来实现联动。
方法1:遍历唯一值构建映射字典
这种方式直观易懂,适合新手理解逻辑:
import pandas as pd # 加载你的数据集(替换成实际文件路径) df = pd.read_csv("student_scores.csv") # 初始化空字典存储学校信息 school_info_map = {} # 遍历所有唯一学校 for school_name in df["school"].unique(): # 筛选当前学校的所有数据 school_data = df[df["school"] == school_name] # 获取该学校对应的唯一环境和类型(假设每个学校对应唯一值) school_setting = school_data["school_setting"].unique()[0] school_type = school_data["school_type"].unique()[0] # 获取该学校的所有唯一教室并排序 available_classrooms = sorted(school_data["classroom"].unique()) # 将信息存入字典 school_info_map[school_name] = { "setting": school_setting, "type": school_type, "classrooms": available_classrooms }
方法2:用Groupby高效实现
如果数据集较大,用groupby会更高效,代码更简洁:
import pandas as pd df = pd.read_csv("student_scores.csv") # 按学校分组,聚合出对应的环境、类型和教室列表 school_grouped = df.groupby("school").agg( school_setting=("school_setting", "first"), # 取第一个值(假设唯一) school_type=("school_type", "first"), classrooms=("classroom", lambda x: sorted(x.unique())) # 聚合唯一教室并排序 ).to_dict("index")
两种方法最终都会得到类似这样的结构:
# 示例:school_grouped["ANKYI"]的输出 { "setting": "Urban", "type": "Non-public", "classrooms": ["6A", "6B", "7A", ...] }
二、实现Streamlit表单的联动效果
有了上面的映射字典,我们就可以在Streamlit中构建联动的输入表单了。核心逻辑是:用户选择学校后,自动从映射字典中提取对应信息,动态更新后续组件。
import streamlit as st # 假设已经加载了上面的school_grouped字典 st.title("学生成绩预测输入表单") # 第一步:学校选择下拉框 selected_school = st.selectbox("选择学校", options=list(school_grouped.keys())) # 根据选中的学校获取对应的信息 current_school_data = school_grouped[selected_school] # 第二步:自动填充学校环境和类型(用禁用的下拉框展示,避免用户修改) st.subheader("学校基础信息") st.selectbox( "学校环境", options=[current_school_data["setting"]], index=0, disabled=True ) st.selectbox( "学校类型", options=[current_school_data["type"]], index=0, disabled=True ) # 第三步:仅展示该学校可用的教室 st.subheader("选择教室") selected_classroom = st.selectbox("教室", options=current_school_data["classrooms"]) # 后续可以继续添加其他表单字段(比如学生性别、午餐类型等) st.subheader("学生信息") gender = st.radio("性别", options=["Male", "Female"]) lunch = st.selectbox("午餐类型", options=["Free/School Lunch", "Regular"])
效果说明
当用户选择「ANKYI」学校时:
- 「学校环境」下拉框会自动选中「Urban」且无法修改
- 「学校类型」下拉框会自动选中「Non-public」且无法修改
- 「教室」下拉框只会展示ANKYI学校的所有可用教室
Streamlit的组件会随着用户的选择自动重新渲染,所以不需要额外的回调函数就能实现联动效果。
内容的提问来源于stack exchange,提问作者beginner_learner
相关产品推荐
相关产品推荐

