質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Streamlit

Streamlitは、Pythonでフロントエンドアプリケーションを構築できるフレームワーク。HTML/CSSの知識が不要で、描画ライブラリで作成したグラフを埋め込むことが可能です。機械学習のレポート作成やデータ分析にも応用できます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Q&A

解決済

1回答

5156閲覧

streamlitで、selectboxの選択時のみ、データセットのカラムに対応した日本語ラベルを表示させたい

H.K2

総合スコア88

Streamlit

Streamlitは、Pythonでフロントエンドアプリケーションを構築できるフレームワーク。HTML/CSSの知識が不要で、描画ライブラリで作成したグラフを埋め込むことが可能です。機械学習のレポート作成やデータ分析にも応用できます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

0グッド

0クリップ

投稿2021/11/06 18:45

前提・実現したいこと

現在、特定のデータセットを読み込んで、複数の側面から可視化する
アプリをStreamlitで作成しようと考えています。(あくまで下の図はテスト的なものです)
イメージ説明

発生している問題・エラーメッセージ

表示部分はざっくり作ってみたのですが、selectboxにデータカラムを表示させる部分で、
カラム名が日本語でないので(何のデータか)よくわからない、というご指摘をいただき、selectboxに表示させる部分と
カラム名を何とか対応させようと思ってcolumnsを直接対応する日本語名に差し替えようと思ったのですが、
追加要望でデータセットの中で、複数カラムに対し、特定の条件でタグをつけたい(注)という要望があり、
データフレームの列追加が発生してしまうと、直接カラム名を置き換えたタイミングで
データフレームの列が合わないなどの問題が発生してしまいます。

(注:下記図(データは仮でgapminderを使用しています)でいうと、たとえば、1970年代のAsiaだけ、
「インフレ時」のようなラベルを付ける、ような用途で使用したい、というユースケースがあります。)

イメージ説明

お聞きしたいこととしては、下記1点です。
①streamlitのselectboxに表示させるときだけ、対応する日本語名を表示させる方法について
ご教示いただけないでしょうか。
※上記において、もとのdataframeは、列の追加が行われる場合でも、正常に動作させるつくりにしたいです。
(列追加をされた場合でも、追加列に対応する日本語を設定したら、selectboxに反映できる)

該当のソースコード

(データフレームの列追加や前処理の部分などは省いています。)

Python3

1 2def a_function(vis_data): 3 cat_list = list(vis_data.select_dtypes(include=[object])) 4 val_list = list(vis_data.select_dtypes(exclude=[object])) 5 # form sample 6 with st.form('my_form_identifier'): 7 f_c1, f_c2, f_c3 = st.columns(3) 8 with f_c1: 9 x_select = st.selectbox("x選択ください", val_list, index=1) 10 x_select2 = st.selectbox("x選択ください", val_list, index=2) 11 with f_c2: 12 y_select = st.selectbox("y選択ください", val_list, index=2) 13 y_select2 = st.selectbox("y選択ください", val_list, index=3) 14 with f_c3: 15 group_select = st.selectbox("層別する対象を選択ください", cat_list, index=1) 16 group_select2 = st.selectbox("層別する対象を選択ください", cat_list, index=2) 17 18 with st.expander('See details'): 19 slider_val = st.slider("Form slider") 20 checkbox_val = st.checkbox("Form checkbox") 21 22 # Every form must have a submit button. 23 submitted = st.form_submit_button("Submit") 24 if submitted: 25 st.write("slider", slider_val, "checkbox", checkbox_val) 26 # 読み込んだデータセットと、formで設定した値を使って、何らかのグラフ描画などを行いたい 27 fig1 = px.scatter(vis_data, x=x_select, y=y_select, color=group_select, 28 marginal_y="violin", marginal_x="box", trendline="ols", template="simple_white") 29 fig2 = px.scatter(vis_data, x=x_select2, y=y_select2, color=group_select2, 30 marginal_y="violin", marginal_x="box", trendline="ols", template="simple_white") 31 # container sample 32 container = st.container() 33 c_col1, c_col2 = container.columns(2) 34 35 with c_col1: 36 st.plotly_chart(fig1, use_container_width=True) 37 with c_col2: 38 st.plotly_chart(fig2, use_container_width=True) 39 40 41def b_function(vis_data): 42 pass 43 44def main(): 45 st.title("ほげほげデータビューワ") 46 47 mode_list = ["a機能", "b機能"] 48 func_sel = st.sidebar.selectbox("機能を選んでください", mode_list) 49 data = pd.DataFrame() 50 51 if 'input_data' not in st.session_state: 52 st.session_state['input_data'] = 0 53 54 # データ取得処理 55 get_data_source = st.sidebar.button("データ取得、更新") 56 if get_data_source: 57 # 何らかのデータ取得処理を記載(ボタン押下時のみ取ってくるようにする) 58 data = px.data.gapminder() 59 st.session_state.input_data = data 60 61 with st.expander('データ詳細'): 62 st.dataframe(st.session_state.input_data) 63 64 if func_sel == "a機能": 65 a_function(st.session_state.input_data) 66 else: 67 b_function(st.session_state.input_data) 68

試したこと

streamlitのリファレンスをチェックした
stackoverflowなどで、問題解決のヒントがないか調べた

補足情報(FW/ツールのバージョンなど)

Python 3.8.7
pandas 1.3.0
streamlit 1.0.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

カラム名と日本語名の対応表を持っておいて、列が追加された場合はこの対応表にカラム名と日本語名を追加する作りにしてはどうでしょうか。

python

1column_name_map = { 2 'country': '国名', 3 'continent': '大陸', 4 'year': '年', 5 ... 6} 7if 'column_name_map' not in st.session_state: 8 st.session_state.column_name_map = column_name_map 9 10column_name_reverse_map = {v:k for k,v in st.session_state.column_name_map.items()} 11 12cat_list = [st.session_state.column_name_map[c] for c in list(vis_data.select_dtypes(include=[object]))] 13val_list = [st.session_state.column_name_map[c] for c in list(vis_data.select_dtypes(exclude=[object]))] 14 15with st.form('my_form_identifier'): 16 f_c1, f_c2, f_c3 = st.columns(3) 17 with f_c1: 18 x_select = column_name_reverse_map[st.selectbox("x選択ください", val_list, index=1)] 19 ... 20 21# 列が追加されたときの処理 22st.session_state.column_name_map[new_column_name] = jp_column_name

投稿2021/11/06 22:05

etherbeg

総合スコア1195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

H.K2

2021/11/07 03:07

ご回答ありがとうございます! 帰宅したら試してみます。 あらかじめ対応表を用意(実運用としては、例えばjsonとかで読み込むなど)し、それの逆変換したものをselectbox表示用に適宜使用する、という形の理解で問題ないでしょうか。
etherbeg

2021/11/07 03:17

selectbox表示用には、対応表を使ってcolumn名を日本語表記に変換したものを使う  country → 国名 selectboxでの選択に基づいてDataFrameから列を選択する際には、対応表を逆変換したものを使って元のcolumn名に戻してから選択する  国名 → country ということです。 あらかじめ対応表を用意するというのははおっしゃる通りです。
H.K2

2021/11/07 22:39

ありがとうございます!確認できました。逆変換すればよかったのですね。勉強になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問