サイトアイコン アマチュア無線局JS2IIU

【Streamlit】選択肢を選ばせる:st.selectboxとst.multiselect

こんにちは、JS2IIUです。
UIの中で既定の選択肢を提示して、選択してもらうドロップボックスは基本的な要素です。Streamlitでどの様に選択肢を扱うかをみていきます。今回もよろしくお願いします。

はじめに

Streamlitは、Pythonだけで簡単にWebアプリを作成できるフレームワークです。
中でも、ユーザーに「選択」をさせたいときに便利なのが st.selectboxst.multiselect です。

st.selectboxとは?

st.selectbox は、単一の選択肢を選ばせるドロップダウンリストです。

📌 基本の使い方

✅ ステップ1:モジュールのインポート

Python
import streamlit as st

✅ ステップ2:選択肢を用意する

Python
fruits = ["りんご", "バナナ", "みかん"]

✅ ステップ3:st.selectboxを使ってドロップダウンを表示

Python
selected_fruit = st.selectbox("好きなフルーツを選んでください:", fruits)

✅ ステップ4:選ばれた値を表示

Python
st.write("あなたが選んだのは:", selected_fruit)

💡 実行結果イメージ

画面には以下のようなドロップダウンが表示され、選択されたフルーツが下に表示されます。

🔍 主なパラメータの解説

パラメータ説明
label表示されるラベルテキスト
options選択肢のリストまたはタプル
index初期選択のインデックス(デフォルトは0)
keyセッション内でユニークな識別子(オプション)

例:初期値を「みかん」にしたい場合

Python
st.selectbox("フルーツを選択:", fruits, index=2)

st.multiselectとは?

st.multiselect は、複数の選択肢を選ばせたいときに使うウィジェットです。

📌 基本の使い方

✅ ステップ1:選択肢を定義

Python
languages = ["Python", "JavaScript", "C++", "Java"]

✅ ステップ2:st.multiselectを使って複数選択UIを表示

Python
selected_languages = st.multiselect("好きな言語を選んでください:", languages)

✅ ステップ3:選ばれた値を表示

Python
st.write("あなたが選んだ言語は:", selected_languages)

🔍 主なパラメータの解説

パラメータ説明
label表示される説明テキスト
options選択肢のリスト
default初期選択される値(リストで指定)
keyユニークキー(省略可)

例:最初からPythonとC++を選択状態にしたい場合

Python
st.multiselect("言語を選んでください:", languages, default=["Python", "C++"])

selectboxとmultiselectの違い

特徴st.selectboxst.multiselect
選択数1つのみ複数選択可能
戻り値の型単一の値(文字列など)リスト(空の場合もある)
主な用途ラジオボタンや選択画面チェックボックス群の代替

用途に応じて、使い分けるのがポイントです。

実践例:データフィルター付きアプリを作る

ここでは、selectboxmultiselectを組み合わせて、簡単なデータフィルターアプリを作ってみましょう。

💡 目的

✅ サンプルコード

Python
import streamlit as st
import pandas as pd

# ダミーデータ
data = pd.DataFrame({
    "商品名": ["りんごジュース", "バナナチップス", "みかんゼリー", "アップルパイ"],
    "カテゴリ": ["飲み物", "お菓子", "デザート", "お菓子"],
    "タグ": [["果物", "甘い"], ["甘い", "軽食"], ["果物", "冷たい"], ["果物", "焼き菓子"]]
})

# カテゴリの選択
selected_category = st.selectbox("カテゴリを選択:", data["カテゴリ"].unique())

# タグの選択
all_tags = sorted({tag for tags in data["タグ"] for tag in tags})
selected_tags = st.multiselect("タグを選択:", all_tags)

# フィルター処理
filtered_data = data[data["カテゴリ"] == selected_category]
if selected_tags:
    filtered_data = filtered_data[filtered_data["タグ"].apply(lambda tags: all(tag in tags for tag in selected_tags))]

# 結果表示
st.write("フィルター後のデータ:")
st.dataframe(filtered_data)

まとめ

参考リンク

最後に書籍のPRです。
24年9月に出版された「ハイパーモダンPython-信頼性の高いワークフローを構築するモダンテクニック」、Claudio Jolowicz著、嶋田、鈴木訳。開発環境の構築、プロジェクトの管理、テストに関して実践的な内容でとても参考になる一冊です。ぜひ手に取ってみてください。

最後まで読んでいただきありがとうございます。

モバイルバージョンを終了