Streamlit × ラジオボタン制御術：一括設定とリセットを実装する

# **user**:


Streamlitで、ラジオボタンがありますよね。たとえばこんなふうに作ります。

```python
    # 目的変数と説明変数の選択
    st.subheader("変数選択")
    group_options = ["未選択", “グループA”, “グループB”, “グループC”]
    group_selection = {}
    for group_option in group_options:
        group_selection[group_option] = []

    # 見出し行
    header_cols = st.columns([1, 4])
    with header_cols[0]:
        st.markdown("**変数名**")
    with header_cols[1]:
        st.markdown("**変数種類**")

    # 各行（列名 + ラジオボタン）を表示
    for col in df.columns:
        row_cols = st.columns([1, 4])
        with row_cols[0]:
            st.write(col)
        with row_cols[1]:
            selected = st.radio(
                label="",
                options=group_options,
                index=0,
                key=f"group_{col}",
                horizontal=True,
                label_visibility="collapsed",
            )
            group_selection[selected].append(col)

    # 結果表示
    if group_selection:
        st.subheader("変数選択結果")
        result_df = pd.DataFrame(
            {
                "変数種類": list(group_selection.keys()),
                "変数名": list(group_selection.values()),
            }
        )
        st.dataframe(result_df)
    else:
        st.info("少なくとも1つの列にグループを割り当ててください。")
```


ラジオボタンが多いと、ひとつひとつ選択するのが大変なので、たとえば「全部グループAにする」を選択してから、いくつか少数のボタンを「グループB」と「グループC」にするような操作が可能なら便利だと思うのですが、できますか？

# **assistant**:

はい、できます！
Streamlitでは、**全体に一括で初期値を設定**してから、必要に応じて個別に変更するというUI設計が可能です。以下のような構成にすると、「全部を一度にグループAに設定」→「一部だけ別のグループに手動変更」が実現できます。

---

## ✅ 実装の考え方

1. **「一括設定」用のセレクトボックスやボタン**を用意。
2. 一括設定で選ばれたグループを初期値にしてラジオボタンを作成。
3. `st.session_state` を使って、ユーザーが個別に変更したときはその変更を保持。

---

## ✅ コード例（改善済み）

```python
import streamlit as st
import pandas as pd

# ダミーデータ
df = pd.DataFrame({
    "変数1": [1, 2, 3],
    "変数2": [4, 5, 6],
    "変数3": [7, 8, 9],
})

st.subheader("変数選択")

group_options = ["未選択", "グループA", "グループB", "グループC"]

# 一括設定
default_group = st.selectbox("全ての変数の初期グループを選択", group_options, index=0)

# 初期化（初回だけ）
if "group_assignments" not in st.session_state:
    st.session_state.group_assignments = {
        col: default_group for col in df.columns
    }

# 表示用ヘッダー
header_cols = st.columns([1, 4])
with header_cols[0]:
    st.markdown("**変数名**")
with header_cols[1]:
    st.markdown("**変数種類**")

# 各行（変数ごとにラジオボタン表示）
for col in df.columns:
    row_cols = st.columns([1, 4])
    with row_cols[0]:
        st.write(col)
    with row_cols[1]:
        selected = st.radio(
            label="",
            options=group_options,
            index=group_options.index(st.session_state.group_assignments[col]),
            key=f"group_{col}",
            horizontal=True,
            label_visibility="collapsed",
        )
        st.session_state.group_assignments[col] = selected

# 結果集計
group_selection = {group: [] for group in group_options}
for col, group in st.session_state.group_assignments.items():
    group_selection[group].append(col)

st.subheader("変数選択結果")
result_df = pd.DataFrame({
    "変数種類": list(group_selection.keys()),
    "変数名": list(group_selection.values()),
})
st.dataframe(result_df)
```

---

## ✅ 特徴と利点

* 一括選択で全体のデフォルトを効率的にセット。
* ラジオボタンで個別修正も可能。
* `st.session_state`で状態保持するので、ユーザーが意図しないリセットを防げます。

---

必要に応じて「一括でグループをリセットする」ボタンなども追加できます。ご希望があればその拡張もご提案できます！

# **user**:

はい、その拡張も加えてください。

# **assistant**:

了解しました！
以下に「一括設定に加えて、一括リセット（全て“未選択”に戻す）」機能を加えた完全版コードをお見せします。

---

## ✅ 拡張ポイント

* 「全て未選択に戻す」ボタンを追加。
* 押されたときに、`st.session_state.group_assignments`をリセット。

---

## ✅ 拡張版コード

```python
import streamlit as st
import pandas as pd

# ダミーデータ
df = pd.DataFrame({
    "変数1": [1, 2, 3],
    "変数2": [4, 5, 6],
    "変数3": [7, 8, 9],
})

st.subheader("変数選択")

group_options = ["未選択", "グループA", "グループB", "グループC"]

# --- 一括設定 UI ---
cols = st.columns([2, 1])
with cols[0]:
    default_group = st.selectbox("全ての変数の初期グループを選択", group_options, index=0, key="default_group")
with cols[1]:
    if st.button("一括設定を適用"):
        st.session_state.group_assignments = {
            col: default_group for col in df.columns
        }

# --- 一括リセットボタン ---
if st.button("すべて未選択にリセット"):
    st.session_state.group_assignments = {
        col: "未選択" for col in df.columns
    }

# --- 初期化（初回または未選択ボタン押下時） ---
if "group_assignments" not in st.session_state:
    st.session_state.group_assignments = {
        col: default_group for col in df.columns
    }

# --- 表示用ヘッダー ---
header_cols = st.columns([1, 4])
with header_cols[0]:
    st.markdown("**変数名**")
with header_cols[1]:
    st.markdown("**変数種類**")

# --- 各変数のラジオボタン ---
for col in df.columns:
    row_cols = st.columns([1, 4])
    with row_cols[0]:
        st.write(col)
    with row_cols[1]:
        selected = st.radio(
            label="",
            options=group_options,
            index=group_options.index(st.session_state.group_assignments[col]),
            key=f"group_{col}",
            horizontal=True,
            label_visibility="collapsed",
        )
        st.session_state.group_assignments[col] = selected

# --- 結果表示 ---
group_selection = {group: [] for group in group_options}
for col, group in st.session_state.group_assignments.items():
    group_selection[group].append(col)

st.subheader("変数選択結果")
result_df = pd.DataFrame({
    "変数種類": list(group_selection.keys()),
    "変数名": list(group_selection.values()),
})
st.dataframe(result_df)
```

---

## ✅ 操作フロー

1. **初期表示時**は `default_group` に従って設定。
2. 「一括設定を適用」で全ての変数にそのグループを再適用。
3. 個別に必要なラジオボタンを手動で変更。
4. 「すべて未選択にリセット」で全ラジオボタンが `"未選択"` に戻る。

---

必要であれば、「保存・読み込み」や「CSV出力」などの機能も追加可能です。どう進めたいか教えてください！

# **user**:

ありがとうございました！今回の内容をブログに残したいので、タイトル案をいくつか提案していただけますか？

# **assistant**:

もちろんです！今回のStreamlitによるラジオボタンの一括設定＆個別編集＋リセット機能というテーマに合った、ブログ記事のタイトル案を以下にご提案します。

---

## 🎯 ターゲット：実用・技術重視タイプ

1. **Streamlitで大量ラジオボタンを一括設定＆個別変更する方法**
2. **Streamlit × ラジオボタン制御術：一括設定とリセットを実装する**
3. **変数の分類操作を効率化！Streamlitでラジオボタンを一括管理**
4. **Streamlitで変数分類UIを強化：グループ一括割当と手動微調整**
5. **大量のラジオボタン、1クリックで初期化＆一部だけ編集：StreamlitでUI最適化**

---

## 💡 キャッチー・やわらかめタイプ

6. **もう迷わない！Streamlitで「全部グループAにしてから調整」する方法**
7. **Streamlitで作るかんたんラジオボタン管理アプリ**
8. **全選択→微調整→リセットもOK！Streamlitで気持ちいい分類操作**
9. **分類の手間を省く！Streamlitで作るスマートな変数グルーピングUI**
10. **Streamlitのラジオボタンが快適に！一括設定＋リセット機能を追加しよう**

---

どの路線で書くか（技術重視／わかりやすさ重視／キャッチーな感じ）を決めると、本文のトーンも整いやすくなります。
方向性が決まっていれば、記事の冒頭文や構成もお手伝いできます！

# **user**:

「Streamlit × ラジオボタン制御術：一括設定とリセットを実装する」にしたいと思います。最後に、詳しいまとめを書いてください。

# **assistant**:

素晴らしいタイトルですね！
「**Streamlit × ラジオボタン制御術：一括設定とリセットを実装する**」にふさわしい、記事の締めとして使える**詳しいまとめ**を以下にご用意しました。

---

## 📝 まとめ：Streamlit × ラジオボタン制御術の実践ポイント

本記事では、Streamlitで多数のラジオボタンを扱う際に発生しがちな「一つひとつ選択するのが面倒…」という課題を解決するためのテクニックを紹介しました。

特に注目すべきは以下の3点です：

### ✅ 1. 一括設定で初期値を一気に割り当てる

* `st.selectbox`とボタンを組み合わせることで、すべてのラジオボタンに対して同じ初期グループを一括で割り当てる機能を実装しました。
* 煩雑な操作を減らし、作業効率が大きく向上します。

### ✅ 2. 個別の手動修正にも柔軟に対応

* ラジオボタンごとに `st.session_state` を利用して状態を保持することで、一括設定後でもユーザーが個別に変更した内容を維持できるようにしました。
* 一括 → 微調整 という自然なワークフローを支援します。

### ✅ 3. すべて未選択にリセットする機能も追加

* 「全て未選択に戻す」ボタンを設置することで、誤った設定や再分類の必要が出た場合にもすぐリセット可能に。
* 状態の初期化をワンクリックで実行できるのは、ユーザビリティ向上に効果的です。

---

## 🔧 実装を応用するアイデア

* 分類した変数を用いた可視化や分析へつなげる。
* グループごとの処理（色分け表示・フィルタリングなど）を行う。
* 選択内容をCSVに保存して、後から読み込めるようにする。

---

Streamlitは手軽にUIを構築できる反面、状態管理や一括操作の工夫が求められます。
今回紹介したように、**`st.session_state`と制御ロジックを組み合わせることで、直感的かつ柔軟なユーザー体験を実現**できます。

---

今後さらに複雑な変数分類や、条件分岐を含むアプリケーションを作成したい場合も、今回のコード構造をベースに発展させることができます。

ぜひ、皆さんのStreamlitアプリに取り入れてみてください！

---

ご希望であれば、このまとめに合わせた**冒頭文**や**コード解説パート**の文章化もお手伝いできますので、遠慮なくどうぞ。


# **user**:

ありがとうございました。これで充分です。また今後もよろしくお願いします！

# **assistant**:

こちらこそ、いつもありがとうございます！
無事にまとまって何よりです 😊
またいつでもお気軽にご相談ください。次回も楽しみにしています！

引き続き、開発・執筆がんばってください！💻✍️📊