2025年5月13日 星期二

Streamlit 學習筆記 : 顯示 DataFrame 資料

Streamlit 的學習從 2023 年初到現在已停頓兩年了, 之後資料科學與 LangChain 學習方便, 打算花點時間把 Streamlit 仔細的測試完. 

本系列之前的文章參考 :  
  

Streamlit 的教學文件參考 :


本篇旨在展示 Streamlit 輸出 DataFrame 的方法. DataFrame 是 Pandas 的二維資料結構, 功能類似 Excel 試算表 (spreadsheet) 中的一張工作表 (worksheet), 基本上就是加上欄 (column) 與列 (row) 索引標籤功能的 Numpy 矩陣. 

建立 DataFrame 的方法有很多, 最常用的是呼叫 DataFrame 類別的建構式 DataFrame() 並傳入一個二維串列建立 DataFrame 物件, 可以同時傳入 index 與 columns 參數 (都是串列) 設定列與欄索引標籤, 例如 :

>>> import pandas as pd   
>>> score=[[78, 34, 65, 87, 99],   
       [100, 99, 89, 92, 100],   
       [88, 72, 95, 81, 100], 
       [67, 85, 73, 100, 56]]     # 二維串列 
>>> index=['張三', '李四', '王五', '趙六']    # 列索引標籤
>>> columns=['國文', '英文', '數學', '自然', '社會']     # 欄索引標籤
>>> df=pd.DataFrame(score, index=index, columns=columns)     # 建立 DataFrame 物件
>>> df   
     國文  英文  數學   自然   社會
張三   78  34  65   87   99
李四  100  99  89   92  100
王五   88  72  95   81  100
趙六   67  85  73  100   56

也可以只傳入資料建立物件後再用 index 與 columns 屬性設定 : 

>>> df=pd.DataFrame(score)   
>>> df    
     0   1   2    3    4
0   78  34  65   87   99
1  100  99  89   92  100
2   88  72  95   81  100
3   67  85  73  100   56

可見若未傳入 index 與 column 參數預設會用整數當索引標籤. 

>>> df.index=index   
>>> df.columns=columns   
>>> df   
     國文  英文  數學   自然   社會
張三   78  34  65   87   99
李四  100  99  89   92  100
王五   88  72  95   81  100
趙六   67  85  73  100   56

接下來就可以用 Streamlit 來輸出此 DataFrame 了. Streamlit 提供如下表所示之四種函式來顯示 DataFrame 資料 : 


常用函式 說明
st.dataframe(df) 以互動式表格顯示 DataFrame, 支援排序與捲動, 適合展示大筆資料.
st.table(df) 以靜態表格顯示 DataFrame (無互動功能), 適合簡報用途.
st.write(df) 自動判斷並以互動式表格顯示 DataFrame, 支援排序與捲動
st.data_editor(df) 將資料輸出維可編輯的互動表格, 適合需要用戶輸入或調整資料的場景.


注意, 在 Streamlit v1.30 之前 write() 會輸出靜態表格, 但 v1.30+ 後改為輸出與呼叫 dataframe() 一樣的互動式表格. 

首先測試 dataframe() 函式, 它會輸出一個互動式的網頁表格, 例如可以按欄名進行升冪/降冪排序, 或者隱藏欄位等, 例如 :


測試 1 : 呼叫 dataframe() [看原始碼]

# dataframe-1.py
import pandas as pd
import streamlit as st

score=[[78, 34, 65, 87, 99],   
       [100, 99, 89, 92, 100],   
       [88, 72, 95, 81, 100], 
       [67, 85, 73, 100, 56]]
index=['張三', '李四', '王五', '趙六']
columns=['國文', '英文', '數學', '自然', '社會']
df=pd.DataFrame(score, index=index, columns=columns)
st.subheader("成績單")
st.dataframe(df)

在命令提示字元視窗用 streamlit run <app.py> 執行此程式 (注意, 舊版 Streamlit 不用 run, 新版改成要用 run 了) : 

D:\python\test>streamlit run dataframe-1.py   

  You can now view your Streamlit app in your browser.

  Local URL: http://localhost:8501
  Network URL: http://192.168.77.135:8501

一般會自動開啟預設瀏覽器連線 http://localhost:850 顯示結果 : 




按 '英文' 欄位, 點選 "Sort descending" 對此欄位內容進行降冪排序 : 





注意, 停止程式執行要先在命令提示字元視窗按 Ctrl+ C, 再關掉瀏覽器網頁, 如果先關掉網頁的話, 在命令提示字元視窗按 Ctrl+ C 會陰找不到目標網頁而無反應. 

呼叫 table() 函式會輸出一個無互動功能的靜態網頁表格, 例如 :


測試 2 : 呼叫 table() [看原始碼]

# dataframe-2.py
import pandas as pd
import streamlit as st

score=[[78, 34, 65, 87, 99],   
       [100, 99, 89, 92, 100],   
       [88, 72, 95, 81, 100], 
       [67, 85, 73, 100, 56]]
index=['張三', '李四', '王五', '趙六']
columns=['國文', '英文', '數學', '自然', '社會']
df=pd.DataFrame(score, index=index, columns=columns)
st.subheader("成績單")
st.table(df)

結果如下 : 





呼叫萬用函式 write() 時它會判斷來源資料是 DataFrame 而自動呼叫 dataframe() 結果會跟 table() 一樣輸出一個互動式表格, 例如 :


測試 3 : 呼叫 write() [看原始碼]

# dataframe-3.py
import pandas as pd
import streamlit as st

score=[[78, 34, 65, 87, 99],   
       [100, 99, 89, 92, 100],   
       [88, 72, 95, 81, 100], 
       [67, 85, 73, 100, 56]]
index=['張三', '李四', '王五', '趙六']
columns=['國文', '英文', '數學', '自然', '社會']
df=pd.DataFrame(score, index=index, columns=columns)
st.subheader("成績單")
st.write(df)

結果如下 : 




呼叫 data_editor() 函式會輸出一個可編輯內容的互動式表格, 例如 :


測試 4 : 呼叫 data_editor() [看原始碼]

# dataframe-4.py
import pandas as pd
import streamlit as st

score=[[78, 34, 65, 87, 99],   
       [100, 99, 89, 92, 100],   
       [88, 72, 95, 81, 100], 
       [67, 85, 73, 100, 56]]
index=['張三', '李四', '王五', '趙六']
columns=['國文', '英文', '數學', '自然', '社會']
df=pd.DataFrame(score, index=index, columns=columns)
st.subheader("成績單")
st.data_editor(df)

點任一儲存格可修改其內容, 例如將李四的英文成績由 99 改成 76 : 





data_editor() 函式會傳回被編輯過的 DataFrame 內容, 在下面範例中我們用一個 edited_df 來取得此傳回值, 然後丟給 dataframe() 顯示 : 


測試 5 : 取得 data_editor() 的傳回值 [看原始碼]

# dataframe-5.py
import pandas as pd
import streamlit as st

score=[[78, 34, 65, 87, 99],   
       [100, 99, 89, 92, 100],   
       [88, 72, 95, 81, 100], 
       [67, 85, 73, 100, 56]]
index=['張三', '李四', '王五', '趙六']
columns=['國文', '英文', '數學', '自然', '社會']
df=pd.DataFrame(score, index=index, columns=columns)
st.subheader("成績單")
edited_df=st.data_editor(df)   # 取得編輯過之內容
st.subheader("編輯過的成績單")
st.dataframe(edited_df)

結果如下 : 




可見上面表格中李四的英文成績被改成 76 後也顯示在底下的表格中, 任何更改都會即時顯示在下方的表格中. 

沒有留言 :