Streamlit DataFrame:在 Streamlit 中显示、样式化与优化 Pandas DataFrame(2025 年更新)
在数据科学领域中,可视化和交互式地查看数据至关重要。Streamlit(一个 Python 库)已经彻底改变了我们用极少代码构建数据密集型 Web 应用的方式。Streamlit 最强大的功能之一是它与 Pandas DataFrame 的无缝集成。本文将深入探讨 Streamlit DataFrame 的用法,演示如何在现代的 Streamlit 应用中显示、样式化和优化 Pandas DataFrame。我们将保持易于跟随的教程风格 —— 从基础用法到高级技巧 —— 并更新到 2025 年的最新能力。
什么是 Streamlit DataFrame?
Streamlit DataFrame 指的是在 Streamlit 应用中展示 Pandas DataFrame(或类似的表格数据)。这就像把 Jupyter notebook 中的静态表格带入到一个交互式的 Web 应用中。底层上,Streamlit 利用 Pandas(以及像 PyArrow 或 Polars 这样的数据结构)来管理数据,但它把这些数据包装成适合 Web 的界面。Pandas DataFrame 是一种二维、带标签的数据结构,在数据科学中随处可见。Streamlit 在 Pandas 基础上提供了一个平台,使 DataFrame 能够被交互式地展示并在运行时由用户操作。你不再只能查看原始表格,还可以对列进行排序、筛选数据、突出显示重要值,甚至允许用户编辑数据 —— 所有这些都通过 Streamlit 的直观组件完成。
Streamlit DataFrame 教程
你有没有听说过这个很棒的数据分析与数据可视化工具,可以轻松把你的 Streamlit 应用变成类似 Tableau 的界面?
PyGWalker (opens in a new tab) 是一个 Python 库,能帮助你轻松将 tableau 替代界面嵌入到你自己的 Streamlit 应用中。 观看这段精彩视频 how to explore data with pygwalker (opens in a new tab),演示了如何使用这个强大的 Data Visualization Python Library 来增强你的 Streamlit 应用!
开始使用 Streamlit DataFrames
首先,确保已安装 Streamlit。你可以通过 pip 安装:
pip install streamlit在你的 Python 脚本中导入 Streamlit,以及用于数据处理的 Pandas:
import streamlit as st
import pandas as pd接下来,创建一个要显示的简单 DataFrame。例如,我们使用一个水果的小数据集:
data = {
"Fruit": ["Apple", "Banana", "Cherry", "Date", "Elderberry"],
"Quantity": [10, 15, 20, 25, 30],
"Price": [0.5, 0.25, 0.75, 1.0, 2.0]
}
df = pd.DataFrame(data)现在,使用 st.dataframe() 在 Streamlit 应用中显示这个 DataFrame:
st.dataframe(df)当你运行 Streamlit 应用(streamlit run your_script.py)时,会看到 DataFrame 被渲染为一个交互式表格。你可以通过点击列头对表格进行排序,也可以拖动右下角来调整表格大小。在现代的 Streamlit 版本中,表格带有工具栏,允许在数据中搜索、复制到剪贴板,甚至将数据下载为 CSV。默认情况下,st.dataframe 会根据内容调整高度以显示最多 10 行,并在行数更多时在表格内显示滚动条。这个基础示例展示了入门的便捷性。接下来我们将探索如何自定义显示并处理更大的数据集。
在 Streamlit 中显示 DataFrames
如何将 DataFrame 显示为交互式表格
如上所示,在 Streamlit 中显示 DataFrame 就是调用 st.dataframe(df)。但这不仅仅是展示表格 —— Streamlit 允许你自定义 DataFrame 的外观和交互性。自定义大小:你可以设置 DataFrame 组件的尺寸以适配应用布局。例如,为了限制表格显示的高度(以像素为单位):
st.dataframe(df, height=300)在上面的代码中,DataFrame 将占用 300 像素的垂直空间(大约一次显示 ~10 行)。如果 DataFrame 行数更多,表格内部会出现滚动条以便用户翻阅数据。同样,你也可以控制宽度。在较新版本中,st.dataframe 接受 width 参数(或者可以使用 width="stretch" 让其扩展为容器的全宽)。例如:
st.dataframe(df, width="stretch", height=300)这会将表格横向拉伸至应用列/容器的全部宽度,同时固定高度。(注意:旧的 use_container_width=True 参数在新的 Streamlit API 中已被 width="stretch" 取代。)交互功能:Streamlit 中的 DataFrame 显示并非静态;它由一个交互式数据网格驱动。用户可以在表格 UI 中直接执行以下操作:
- 点击列头进行升序/降序排序。
- 拖动列边缘调整列宽,或拖动列头以重新排序或固定列。
- 使用列菜单(通常在列头的溢出 “⋮” 菜单)来隐藏/显示特定列。
- 在表格工具栏使用搜索框(或按 Ctrl+F/Cmd+F)查找整个 DataFrame 中的条目。
- 选择单元格并按 Ctrl+C/Cmd+C 复制,或使用工具栏中的下载按钮将数据下载为 CSV 文件。
使用 st.dataframe 时,以上功能通常是默认启用的,使其成为探索数据的强大工具。
高亮数据与条件格式化
通常你可能想突出显示 DataFrame 中的某些值。一个便捷的方法是使用 Pandas Styler 在显示之前应用条件格式化。Streamlit 支持渲染 Pandas Styler 对象,这意味着你可以使用诸如 highlight_max、highlight_min、background_gradient 等方法,然后将样式化后的 DataFrame 传给 Streamlit。例如,要高亮每列中的最大值:
st.dataframe(df.style.highlight_max(axis=0))在此示例中,每列的最大值将被高亮(使用默认高亮样式)。你可以进一步自定义样式或使用不同的 Styler 方法。另一个例子:基于每列的值应用颜色渐变:
st.dataframe(df.style.background_gradient(cmap="Blues"))这将根据数值大小将单元格背景从浅到深的蓝色着色,有助于一目了然地观察分布。Streamlit 会显示这些样式化的 DataFrame,但请注意某些 Pandas 的高级样式功能(例如单元格内的条形图或悬浮提示)可能无法在 Streamlit 表格中完全支持。常见的颜色、文本和基本格式样式通常是可行的。
在 Streamlit 中处理大规模 DataFrame
处理大型 DataFrame(数千甚至数百万行)对任何 Web 应用来说都是一项挑战。Streamlit 的表格组件为性能而设计,可以通过高效的虚拟化(只绘制可见部分)以及基于 HTML canvas 的渲染来处理非常大的数据集。然而在处理巨量数据时仍需考虑一些实际问题和限制:
- 浏览器与网络限制:通常整个数据需要从 Streamlit 服务器发送到浏览器。极大的数据集可能会触及 WebSocket 消息大小限制或耗尽浏览器内存。例如,如果你尝试发送一个百万行的 DataFrame,应用可能能处理,但在传输和客户端渲染时会变慢。
- 自动优化:Streamlit 会自动为大表关闭某些功能以保持响应性。例如,如果数据集超过约 ~150,000 行,Streamlit 会关闭列排序以加速渲染。非常大的表可能不支持全部交互功能以避免性能问题。
- 大数据的最佳实践:
- 显示数据子集:与其一次性把整个大型 DataFrame 倒入
st.dataframe,不如显示经过筛选或采样的子集。例如,可以让用户选择要查看的列或日期范围,或者只显示前 N 行并提供分页选项。 - 实现简单的分页:你可以手动创建分页机制。一种方法是使用滑块或数字输入作为页面索引,然后对 DataFrame 进行切片:
- 显示数据子集:与其一次性把整个大型 DataFrame 倒入
page_size = 100 # rows per page
total_rows = len(df)
total_pages = (total_rows - 1) // page_size + 1
page = st.number_input("Page", min_value=1, max_value=total_pages, value=1)
start_idx = (page - 1) * page_size
end_idx = start_idx + page_size
st.write(f"Showing rows {start_idx} to {min(end_idx, total_rows)}")
st.dataframe(df.iloc[start_idx:end_idx])在此示例中,用户可以选择页码来查看每页 100 行的数据片段。这可以防止应用尝试一次性渲染整个 DataFrame,从而提升响应性。
- 利用惰性 DataFrame:Streamlit 可以显示来自 PySpark 或 Snowflake(Snowpark)DataFrame 的数据。这类数据结构仅在需要时才拉取数据,这意味着如果你应用了筛选或限制,处理可以在后端(例如在数据库或 Spark 引擎中)完成,仅把有限结果发送给 Streamlit。如果你的数据集极其庞大且驻留在数据库或大数据平台,考虑分块查询或使用此类惰性评估方法,而不是将一切加载到内存中的 Pandas DataFrame。
- 对数据加载使用缓存:(我们将在后面的章节详细介绍缓存,简而言之,缓存数据检索步骤以避免在每次应用重运行时重复读取大型数据集。)
通过注意上述策略,你可以在 Streamlit 中更顺畅地处理大型数据集。关键在于避免一次性向前端传输过多数据,并利用 Streamlit 的性能特性。
在 Streamlit 中样式化 DataFrames
展示数据是一回事 —— 让其看起来美观且易读是另外一回事。Streamlit 提供了多种方式来样式化你的 DataFrame,从内建格式化选项到自定义 CSS(有一些限制)。下面我们来探索如何增强表格的外观。
我可以在 Streamlit 中使用 CSS 样式化 DataFrame 吗?
你可能想知道是否可以像在网页中那样对 Streamlit 中的 DataFrame 应用自定义 CSS。简短回答是可以,但需谨慎。Streamlit 允许通过 st.markdown 配合 unsafe_allow_html=True 标志注入 HTML/CSS。这意味着你可以尝试用 CSS 针对表格元素。例如,要改变表格背景颜色:
st.markdown(
"""
<style>
table { background-color: #f0f0f0; }
</style>
""",
unsafe_allow_html=True
)
st.dataframe(df)在这个片段中,我们插入了一个 <style> 块,将所有 HTML <table> 背景设置为浅灰色,然后调用 st.dataframe(df)。如果底层渲染使用标准的 HTML 表格元素,这可能会影响 DataFrame 的样式。然而请记住:
- 这种方法并不是官方支持的,且如果 Streamlit 的内部实现发生变化,可能会失效。实际上,现代的
st.dataframe基于 HTML canvas 渲染,并不总是使用简单的 HTML 表格来呈现数据单元,因此一些 CSS 选择器可能无法生效。 - 使用
unsafe_allow_html=True通常不推荐,除非作为临时技巧,因为它可能带来安全或稳定性问题(例如,意外地全局样式化了某些内容)。
总之,虽然你可以通过 CSS 做一些小的调整(例如设置背景颜色或字体样式),但尽量优先使用 Streamlit 提供的内建样式化功能。
使用 Pandas 和 column_config 在 Streamlit 中样式化 DataFrame
在 Streamlit 中更稳健的样式化方式是使用 Pandas Styler(如前节所示的 highlight_max、background_gradient)或使用 Streamlit 的列配置选项来进行格式化。Pandas Styler:你可以应用 Pandas 提供的多种样式化函数。例如:
df.style.format(format_dict)—— 对每列进行数字或日期格式化(例如将浮点数显示为百分比或货币)。df.style.applymap(func)—— 逐元素应用样式函数(例如把负数标为红色)。df.style.set_properties(**props)—— 对特定单元格设置 CSS 属性(尽管并非所有属性都会在 Streamlit 中生效)。df.style.hide(axis="index")—— 如果索引对展示无意义,可以隐藏索引。
在用 Pandas 进行样式化后,将 Styler 对象传给 st.dataframe(),就像我们用 highlight_max 时那样。列配置:Streamlit(自 v1.22+)为 st.dataframe 和 st.data_editor 引入了 column_config 参数,允许你自定义列的显示方式。这是一种用 Python 指定列显示行为的方式,例如:
- 列标签(在不改变 DataFrame 本身的情况下重命名显示列头)。
- 隐藏特定列。
- 设置数据类型显示(例如将某列标记为 Image 列、Link 列、Checkbox、Datetime 等,这会改变其呈现方式)。
- 格式化数字或日期(类似于 Styler,但通过 Streamlit API 实现)。
例如,假设你的 DataFrame 有一列价格,你想把它显示为美元货币并重命名列头:
import streamlit as st
import pandas as pd
df = pd.DataFrame({
"item": ["A", "B", "C"],
"price": [1.5, 2.0, 3.25]
})
st.dataframe(
df,
column_config={
"price": st.column_config.NumberColumn(
"Price (USD)",
format="$%.2f"
)
}
)在该示例中:
- 我们把
price列在显示中重命名为Price (USD)。 - 我们将该列的数字格式化为带两位小数的美元格式。
这种方法无需自定义 CSS 即能得到格式化良好的表格,并且与 Streamlit 的交互式网格兼容。你也可以通过将某列的配置设为 None 来隐藏列,或对不同数据使用其他列配置类型(如图像或布尔类型)。总之,尽可能使用 Pandas Styler 或 Streamlit 的列配置来样式化,因为它们比注入原始 CSS 更稳定、更能表达常见需求。
在 Streamlit 中优化 DataFrame
随着你构建更复杂的应用或处理更大的数据集,性能变得很关键。本节介绍如何为速度和效率优化在 Streamlit 中使用的 DataFrame,重点讨论缓存和其他最佳实践。
如何在 Streamlit 中优化 Pandas DataFrame
这里的优化既指优化应用性能(加载时间、响应速度),也指优化资源使用(例如内存)。以下是一些关键策略:
使用 Streamlit 的缓存来加速数据加载与计算:避免重复执行代价高昂的操作是加速应用的简单方法。如果你有一个存储在 CSV 或数据库中的大型数据集,每次应用运行都重新加载会很慢。Streamlit 提供了缓存机制来解决这个问题。在较旧的版本中,你可能见过 @st.cache。在当前的 Streamlit 中,应使用 @st.cache_data 来缓存返回数据(如 DataFrame)的函数。例如:
import pandas as pd
import streamlit as st
@st.cache_data
def load_data():
# Imagine this is an expensive operation, e.g., reading a large CSV
df = pd.read_csv("large_dataset.csv")
# (You could do additional processing here if needed)
return df
# Use the cached function to load data
df_large = load_data()
st.dataframe(df_large.head(100)) # Display just first 100 rows as an example通过使用 @st.cache_data,第一次运行会加载 CSV 并将生成的 DataFrame 存入缓存。在随后的运行中(只要函数输入没有变化),Streamlit 将跳过 load_data() 的执行,并从缓存中检索 DataFrame。这会显著加快那些反复需要相同数据的应用。
优化 DataFrame 的大小与数据类型:通过使用合适的数据类型可以优化大型 DataFrame。例如,将类别性文本数据转换为 Pandas 的 Categorical 类型可以节省内存;只需 0/1 或 True/False 的列应使用布尔类型而不是整数;不需要高精度的浮点数可向下转换为 float32。Pandas 中这些优化能够减少内存使用,间接提升 Streamlit 的性能(特别是在资源受限的服务器上部署时尤为重要)。
使用高效的数据格式:如果你能控制数据源,使用 Parquet 或 Arrow 等二进制格式可以比 CSV 更快地加载数据。Streamlit 可以直接读取 Arrow 表并高效处理它们。这也与缓存策略结合使用 —— 例如,你可以缓存读取 Parquet 文件的结果,因为它本身比 CSV 加载更快。
下面更详细地看一下缓存和性能提示,因为缓存是优化中非常重要的一环。
Streamlit DataFrame 缓存与性能提示
缓存是 Streamlit 的强大工具,但需要正确使用。以下是一些缓存与性能的提示与最佳实践:
选择合适的缓存装饰器:对返回数据(如 DataFrame、列表、字典等)的函数使用 @st.cache_data。对单例资源(例如数据库连接、机器学习模型或其他应初始化一次并重复使用的对象)使用 @st.cache_resource。用合适的新装饰器替换旧的 @st.cache 可以避免弃用警告,并针对用例获得更好的性能。
函数输入很重要:缓存函数基于其输入参数进行失效处理。每当你用新参数调用缓存函数时,它将重新执行并缓存新的结果。这对数据更新很有用。例如:
@st.cache_data
def load_data(filename):
return pd.read_csv(filename)
file_choice = st.selectbox("Choose a data file", ["data1.csv", "data2.csv"])
df = load_data(file_choice)
st.dataframe(df.head())在这种场景下,如果用户从 "data1.csv" 切换到 "data2.csv",load_data 会为新文件执行并缓存结果。切换回 "data1.csv" 时会从缓存中取回。此行为确保你的应用在处理多个数据集时高效且不重复计算。
避免修改缓存中的数据:一个常见陷阱是就地修改缓存对象。例如,如果你缓存了一个 DataFrame 然后在内存中修改它,这些更改会在缓存对象中保留,可能导致意外结果。使用 st.cache_data 时,Streamlit 会帮助避免此类问题,通常会在每次从缓存中返回时提供数据的副本以防止变异问题。你通常不需要使用旧版 allow_output_mutation=True(这是 st.cache 的一个选项),因为新系统以不同方式处理该问题。如果确实需要缓存一个必须被修改的对象,考虑使用 st.cache_resource,但请谨慎并记录这种行为。
在需要时清除缓存:如果你的数据在外部更新且需要刷新缓存,可以为用户添加一个手动清除缓存的按钮(例如 st.cache_data.clear()),或者在缓存键中包含外部数据版本的哈希或时间戳。你还可以设置缓存的 ttl(生存时间)。例如,如果你知道数据每天更新一次,可以在装饰器中设置 @st.cache_data(ttl=86400) 使缓存在一天后过期。这样可以确保用户不会一直看到陈旧数据。
限制 DataFrame 的渲染大小:即便有缓存,在浏览器中渲染巨大的 DataFrame 仍然会很慢。通常明智的做法是限制一次性显示的 DataFrame 数量。我们之前讨论了使用 height 参数或手动分页的方式。另一个简单策略是只显示大数据集的摘要或样本,并提供下载链接或按需显示完整视图。Streamlit 应专注于用户当前分析中最相关的数据切片,而不是一次性展示所有数据,这样既不会压垮用户也不会压垮浏览器。如果确实需要展示大量数据,用户可以使用搜索和滚动功能,但要确保应用保持响应性。
遵循这些缓存与性能建议,你的 Streamlit 应用即使在数据增长时也能保持流畅和高效。
Streamlit DataFrame:高级用例
本节我们探索几个高级(但常见)的场景,在这些场景中 Streamlit DataFrame 扮演重要角色:交互式筛选数据以及将 DataFrame 用于机器学习工作流的整合。
Streamlit DataFrame 筛选
筛选数据是数据探索的核心部分。Streamlit 的小部件使得为 DataFrame 显示添加交互式筛选变得容易。你可以让用户动态选择如何筛选 DataFrame,而不是预先定义静态子集。举例来说,假设你想让用户通过选择某个数值列的范围来筛选 df。你可以使用滑块来选择范围,并用 selectbox 选择要筛选的列:
# Assume df is already loaded
column = st.selectbox("Select column to filter", df.columns)
if pd.api.types.is_numeric_dtype(df[column]):
min_val, max_val = int(df[column].min()), int(df[column].max())
# Slider to pick a range within [min, max]
range_values = st.slider(f"Filter {column} between:", min_val, max_val, (min_val, max_val))
# Filter the dataframe based on slider
filtered_df = df[(df[column] >= range_values[0]) & (df[column] <= range_values[1])]
else:
# If non-numeric, maybe use multiselect for categories
options = st.multiselect(f"Filter values for {column}:", df[column].unique(), default=list(df[column].unique()))
filtered_df = df[df[column].isin(options)]
st.dataframe(filtered_df)在此示例中:
- 我们首先让用户选择要筛选的列。
- 如果所选列是数值类型,则显示一个从列最小值到最大值的范围滑块,用户选择的范围返回一个
(min_val, max_val)元组。然后我们根据该范围对df进行筛选。 - 如果列是非数值(例如字符串/类别),我们使用 multiselect 小部件让用户选择要包含的值,然后据此筛选。
- 最后,我们显示
filtered_df。
这个模式可以适配很多场景:你可以同时有多个筛选器(只需添加更多小部件和条件),或针对不同列类型使用不同的小部件(日期列使用日期选择器,字符串使用文本输入模糊匹配等)。结果是一个用户可以实时切片和解析 DataFrame,并立即看到满足条件的数据表格。
在机器学习应用中使用 Streamlit DataFrames
Streamlit 不仅适合静态数据展示 —— 它也非常适合构建交互式的机器学习演示和仪表盘。DataFrame 常在 ML 应用中出现:例如展示训练数据预览、显示特征重要性分数,或让用户上传新数据以进行预测。下面是一个简单示例:你有一个数据集,想允许用户点击按钮来训练模型(比如一个分类器),然后展示结果。你可以使用 DataFrame 显示数据,并用 Streamlit 小部件管理交互:
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# Display the DataFrame (e.g., training dataset preview)
st.dataframe(df)
# Let user trigger model training
if st.button("Train Model"):
# Assume 'target' is the label column in df
if 'target' not in df.columns:
st.error("No target column found in data!")
else:
# Split the data
X = df.drop('target', axis=1)
y = df['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Train a simple RandomForest model
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
# Evaluate the model
preds = model.predict(X_test)
accuracy = accuracy_score(y_test, preds)
# Display accuracy result
st.write(f"**Model Accuracy:** {accuracy*100:.2f}%")这个 ML 应用片段做了什么:
- 我们显示 DataFrame
df,以便用户检查原始数据。 - 我们添加了一个名为 "Train Model" 的按钮。当用户点击时,
if st.button块下的代码会执行。 - 我们进行简单的检查以确保数据中有
target列(即要预测的标签)。 - 将 DataFrame 切分为特征(X)和目标(y),再切分为训练集和测试集。
- 初始化一个
RandomForestClassifier(来自 scikit-learn)并在训练集上训练它。 - 在测试集上进行预测并计算准确率。
- 使用
st.write在应用中展示准确率。
这个简单示例展示了如何将 DataFrame 的展示与交互控制结合,创建一个迷你机器学习流水线。你可以让用户调整超参数(例如通过滑块设置森林中的树数、调整测试集比例),或选择不同模型并实时查看结果。DataFrame 在这里是核心部分,用于呈现训练数据或结果(你也可以显示预测结果的 DataFrame 或错误分类的示例等)。借助 Streamlit 的交互式 DataFrame 与小部件,你可以把脚本变成一个真正的应用,让用户实时进行实验。
结论
Streamlit 使构建交互式数据应用比以往任何时候都更容易,而它与 Pandas DataFrame 的集成为你带来了强大的工具。本文我们介绍了如何在 Streamlit 中显示 DataFrame,从基础用法到高级自定义。我们讨论了如何为可读性进行样式化、如何高效地处理大型数据集,以及 DataFrame 在交互式筛选和机器学习用例中的应用。借助 2025 年的最新更新,st.dataframe 在功能和性能上更胜以往 —— 提供内建的排序、搜索、下载以及能够处理大量数据的快速网格渲染。我们还提到了在需要用户编辑或贡献数据时可使用的 st.data_editor。无论你是资深数据科学家还是初学者,Streamlit 都提供了一个友好且强大的平台来共享数据洞察。一个在 notebook 中静态的 DataFrame 可以在 Streamlit 应用中变成一个交互式的探索工具。继续实践时,记得使用缓存以提升性能,关注用户体验(优先显示最相关的数据切片而不是一次性展示全部),并利用丰富的样式化选项让数据更清晰地讲述故事。去试试这些技巧,把你的 DataFrame 变成交互式表格,围绕它构建仪表板,或者创建下一个令人惊叹的数据科学 Web 应用。结合 Pandas 与 Streamlit,可能性无限!
你有没有听说过这个很棒的数据分析与数据可视化工具,可以把你的 Streamlit 应用变成 Tableau 风格的界面?
PyGWalker (opens in a new tab) 是一个 Python 库,能帮助你轻松将 tableau 替代界面嵌入到你的 Streamlit 应用中。
常见问题
如何在 Streamlit 中样式化 DataFrame? – 你可以同时使用 Pandas 的样式功能和 Streamlit 的显示选项来样式化 DataFrame。例如,使用 Pandas Styler 方法如 highlight_max 或 background_gradient 来添加颜色高亮。你也可以通过 st.markdown(配合 unsafe_allow_html=True)注入自定义 CSS 来做一些简单的样式调整(不过这是高级用法且功能有限)。此外,利用 st.dataframe 中的 column_config 可以以直接的方式格式化列(例如数字格式、隐藏索引等)。
如何在 Streamlit 中筛选 DataFrame? – Streamlit 提供了交互式小部件来简化筛选。你可以使用下拉框(st.selectbox 或 st.multiselect)做类别筛选,用滑块(st.slider)处理数值范围,用文本输入做文本搜索等。在代码中,使用这些小部件的返回值对子集 DataFrame(例如 df[df[column] == value] 或使用 pandas 的布尔索引来处理范围条件)。当用户调整小部件时,应用会实时更新并显示筛选后的数据。
我可以在 DataFrame 单元格中显示图片吗? – Streamlit 可以显示图片,但目前通常不能直接在 st.dataframe 的单元格内部嵌入图片。一种常见做法是在 DataFrame 中保留图片 URL 或文件路径这一列,然后循环遍历 DataFrame 并对每张图片调用 st.image()(或使用 st.columns 以网格方式排列)。另外,如果你有小的缩略图 URL,并且列配置支持将该列标记为 Image 列(当该功能可用时),可能会直接显示图片。但通常情况下,你会通过单独的 Streamlit 调用来处理图片,而不是嵌入在 st.dataframe 中。记得任何图片数据需要可访问(作为 URL 或已上传的文件)才能被 st.image 显示。
