如何在Streamlit中为Pandas分组DataFrame添加CSV下载超链接
问题描述
我正在使用cars.csv数据集,已完成以下操作:
- 将该.csv文件转换为Pandas DataFrame(对应变量
df) - 按车型对DataFrame进行分组(对应变量
grouped_df) - 待完成:在
grouped_df中添加一列,包含可下载对应车型完整数据.csv的超链接,点击链接时需下载df中对应车型的所有行数据,代码将部署在Streamlit应用中。
现有代码
import pandas as pd from IPython.display import HTML df = pd.read_csv("cars.csv", delimiter=';', skiprows=[1]) display(df.head(5)) grouped_df = df.groupby('Car').agg(NumberOfCars=('Car', 'size'), MeanOfWeight=('Weight', 'mean'), MeanOfAcceleration=('Acceleration', 'mean')) grouped_df.insert(len(grouped_df.columns), "DownloadCsv", 'Download the details (.csv)') grouped_df['DownloadCsv'] = grouped_df['DownloadCsv'].apply(lambda x: f'<a href="https://stackoverflow.com/{x}">{x}</a>') HTML(grouped_df.sample(5).to_html(escape=False))
代码运行预览
display(df.head(5))输出:
HTML(grouped_df.sample(5).to_html(escape=False))输出:
编辑尝试(存在问题)
参考建议后编写了如下代码,但当前实现是下载整个数据集,而非对应车型的数据:
csv = df.to_csv(index=False, sep=';') b64 = base64.b64encode(csv.encode()) payload = b64.decode() grouped_df['DownloadCsv'] = grouped_df['DownloadCsv'].apply( lambda x: f'<a download="{x}.csv" href="data:text/csv;base64,{payload}" target="_blank">{x}</a>') st.write(HTML(grouped_df.sample(5).to_html(escape=False)), unsafe_allow_html=True)
编辑后预览

可行实现方案
要实现点击链接下载对应车型的数据,需针对每个车型单独生成csv的base64编码,具体代码如下:
import pandas as pd import base64 import streamlit as st # 读取数据 df = pd.read_csv("cars.csv", delimiter=';', skiprows=[1]) # 分组并计算聚合指标,同时将Car从索引转为普通列 grouped_df = df.groupby('Car').agg( NumberOfCars=('Car', 'size'), MeanOfWeight=('Weight', 'mean'), MeanOfAcceleration=('Acceleration', 'mean') ).reset_index() # 定义生成对应车型下载链接的函数 def create_download_link(car_name): # 筛选当前车型的所有数据 car_data = df[df['Car'] == car_name] # 转换为csv格式 csv_content = car_data.to_csv(index=False, sep=';') # 对csv内容进行base64编码 b64_encoded = base64.b64encode(csv_content.encode()).decode() # 生成带下载属性的HTML链接,文件名使用车型名称 download_link = f'<a download="{car_name}.csv" href="data:text/csv;base64,{b64_encoded}" target="_blank">Download the details (.csv)</a>' return download_link # 为每个车型生成专属下载链接 grouped_df['DownloadCsv'] = grouped_df['Car'].apply(create_download_link) # 在Streamlit中渲染包含下载链接的表格 st.write(grouped_df.to_html(escape=False), unsafe_allow_html=True)
关键说明
- 通过
reset_index()将分组后的Car索引转为普通列,确保能在apply中获取到每个车型的名称。 - 自定义
create_download_link函数,针对单个车型筛选数据、生成对应csv的编码和下载链接,保证点击时仅下载该车型的完整数据。 - Streamlit中通过
st.write搭配unsafe_allow_html=True,正确渲染包含超链接的HTML表格。
内容的提问来源于stack exchange,提问作者Timeless
相关产品推荐
相关产品推荐

