Streamlitの編集可能なDataFrameの使い方
最近Streamlitに、編集可能なdataframeが導入されました。公式ドキュメントの説明が十分に分かり易いので、使い方自体は特に迷わないかもしれません。ここでは、秒では分からない部分を埋めていきたいと思います。
0. 基本
import streamlit as st
import pandas as pd
df = pd.DataFrame([{"column 1": "st.selectbox", "column 2": 3}])
edited_df = st.data_editor(df) # 👈 An editable dataframe
st.data_editor
でラップしてやれば、
というかんじで編集可能なDataFrameができます。すごいですね。
1. 何ができるのか
テーブル内の値が変更できる
テーブル内で値を変更すると、動的に変更がsession_stateに反映されます
行が追加できる
edited_df = st.data_editor(df, num_rows="dynamic")
とすると、下に灰色がかった行が現れて、行が追加できるようになります:
行が削除できる
num_rows="dynamic"
のオプションをつけると、一番左の列にチェックボックスが出てきます:
行を選択してdeleteキーを押すと、行が削除できます。
元のdataframeからある機能
元からある設定についてもよく忘れるので、備忘録としてリストしておきます:
- 画面幅一杯に表示する:
use_container_width=True
- (思いつき次第、随時追加予定)
2. その時session_stateはどうなっているのか
冒頭の例に、num_rows="dynamic"
のオプションをつけて行を追加できるようにしてみます。その後編集をすると、st.session_state
はどのように更新されるのかを見てみます。
次のように編集したとします:
- 1行目の2列目の値が3だったのを1にした
- 2行目の1列目に"st.checkbox"という値を追加した
v1.22 (旧バージョン)
するとst.session_state
は以下のようになります:
つまり、初期状態からあった要素についてはedited_cells
で管理され、追加した要素についてはadded_rows
で管理されます。追加した行をされに変更しても、added_rows
のほうで値が更新されます。このようにして、追加された要素と最初からある要素は切り分けられているので、作る前に念頭に置いておくと良いかもしれません。
同様に、(最初から存在していた)行を削除したときも、deleted_rows
という項目が生成されて、そこで管理されます:
削除前に編集をしていたとしても、削除されればedited_cells
の内容は消えて、deleted_rows
のみが残ります。追加した行を削除した場合は、added_rows
から情報が消えるだけで、deleted_rows
には何も反映されません。
3. つまづきポイント: 変な列(index)が出来てしまう
冒頭の例では、具体的にDataFrameの中身を与えていますが、
df = pd.DataFrame( columns=["Column 1", "Column 2"] )
という感じに作ったDataFrameだと、下のようにindexの列が追加されてしまいます(2023/3/16現在):
ちなみにこれは普通のDataFrameの場合 (st.dataframe
) でも同様の挙動になります。
これは仕様としてどうなんだろうと思いますが、ひとまず
df = pd.DataFrame( columns=["Column 1", "Column 2"] ).reset_index()
としておくと、
というかんじになります。一番左の列は、チェックマークの列なので多分消せません。
ちなみにst.dataframe
のほうは、これをやっても空欄の列は消えませんでした。
Discussion