🆒

Streamlitの編集可能なDataFrameの使い方

2023/03/16に公開

最近Streamlitに、編集可能なdataframeが導入されました。公式ドキュメントの説明が十分に分かり易いので、使い方自体は特に迷わないかもしれません。ここでは、秒では分からない部分を埋めていきたいと思います。

0. 基本

app.py
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