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

如何对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 17:29:09