如何将DataFrame转换为纵向Markdown表格并同步至Excel?
DataFrame转纵向Markdown表格并保存至Excel方案
一、自定义函数生成纵向Markdown表格
针对转置后使用to_markdown()出现的表头异常问题,可通过自定义函数直接生成符合要求的纵向Markdown表格(列标题位于行首,带管道符和分隔线),且适配任意大小的DataFrame:
def df_to_vertical_md(df): # 初始化Markdown表格基础结构 md_table = "| 项目 | 数据 |\n" md_table += "|------|------|\n" # 遍历原DataFrame的每一列(列名作为纵向表格的分类标题) for col in df.columns: # 添加加粗的列名行 md_table += f"| **{col}** | |\n" # 依次写入该列的所有数据 for idx, val in enumerate(df[col], 1): md_table += f"| 行{idx} | {val} |\n" return md_table
函数说明
- 先构建纵向表格的固定表头("项目"和"数据")
- 自动遍历原DataFrame的所有列,将列名作为加粗的分类项
- 逐行写入对应列的数据,适配任意行数和列数的DataFrame
示例测试
import pandas as pd # 构建你提供的示例DataFrame data = { "Project 1": ["data 1", "data 4", "data 7"], "Project 2": ["data 2", "data 5", "data 8"], "Project 3": ["data 3", "data 6", "data 9"] } df = pd.DataFrame(data) # 生成纵向Markdown表格 vertical_md = df_to_vertical_md(df)
输出的Markdown表格如下:
| 项目 | 数据 | |------|------| | **Project 1** | | | 行1 | data 1 | | 行2 | data 4 | | 行3 | data 7 | | **Project 2** | | | 行1 | data 2 | | 行2 | data 5 | | 行3 | data 8 | | **Project 3** | | | 行1 | data 3 | | 行2 | data 6 | | 行3 | data 9 |
渲染后效果:
| 项目 | 数据 |
|---|---|
| Project 1 | |
| 行1 | data 1 |
| 行2 | data 4 |
| 行3 | data 7 |
| Project 2 | |
| 行1 | data 2 |
| 行2 | data 5 |
| 行3 | data 8 |
| Project 3 | |
| 行1 | data 3 |
| 行2 | data 6 |
| 行3 | data 9 |
二、将Markdown表格存入Excel
使用openpyxl库可直接把生成的Markdown表格字符串写入Excel指定单元格,方便后续更新Markdown网站。以下是翻译并优化后的代码:
from openpyxl import load_workbook # 传入之前生成的Markdown表格字符串 vertical_md = df_to_vertical_md(df) # Excel文件路径 file_source = 'Source Used.xlsx' # 加载目标Excel工作簿 workbook = load_workbook(filename=file_source) # 选择要写入的工作表(替换为你的实际工作表名称) ws4 = workbook["Project X"] # 将Markdown表格写入指定单元格(此处为第1行第1列) ws4.cell(row=1, column=1).value = vertical_md # 保存修改后的Excel文件 workbook.save(filename=file_source)
注意事项
- 需提前安装
openpyxl库:pip install openpyxl - 若目标工作表不存在,需先创建:
workbook.create_sheet("Project X") - 写入的单元格会完整保留Markdown格式字符串,后续可直接复制到Markdown文件中使用
三、横向Markdown表格生成(补充)
如果需要生成横向表格,可直接使用to_markdown()并移除索引:
horizontal_md = df.to_markdown(index=False)
输出:
| Project 1 | Project 2 | Project 3 | |:------------|:-----------:|------------:| | data 1 | data 2 | data 3 | | data 4 | data 5 | data 6 | | data 7 | data 8 | data 9 |
内容的提问来源于stack exchange,提问作者Ben Kluger
相关产品推荐
相关产品推荐

