You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)

关键说明

  1. 通过reset_index()将分组后的Car索引转为普通列,确保能在apply中获取到每个车型的名称。
  2. 自定义create_download_link函数,针对单个车型筛选数据、生成对应csv的编码和下载链接,保证点击时仅下载该车型的完整数据。
  3. Streamlit中通过st.write搭配unsafe_allow_html=True,正确渲染包含超链接的HTML表格。

内容的提问来源于stack exchange,提问作者Timeless

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 17:09:24