You need to enable JavaScript to run this app. 如何将含嵌套DataFrame的Python字典列表导出为指定格式的CSV文件
优惠活动
大模型
产品
解决方案
定价
更多

如何将含嵌套DataFrame的Python字典列表导出为指定格式的CSV文件

实现方案

原方案问题根源

直接执行pd.DataFrame(db).to_csv('test.csv')无法导出正确结果,核心原因是你的db结构为列表嵌套单键字典、字典值为DataFrame,直接将该列表传入pandas构造函数时,pandas不会解析嵌套的DataFrame内容,只会把每个字典的分类键作为列名,单元格内直接存储整个DataFrame对象,最终导出时自然只能看到键名,无法获取实际表格数据。

分步实现逻辑

  • 第一步:拆解嵌套结构,将列表中每个单键字典展开为「分类名: 对应DataFrame」的映射关系,避免后续操作时反复遍历列表查找分类对应的数据
  • 第二步:利用pandas按列拼接的特性,自动对齐所有分类DataFrame的共同行索引(你的结构中所有块的行索引均为4,5,6,8,11,14,空值位置自动保留)
  • 第三步:按排版要求在表格顶部添加跨分类块的标题行,实现每个分类带块标题、下方展示自身字段和数据的效果

可直接运行的代码

1. 展开嵌套结构

import pandas as pd
from openpyxl.utils.dataframe import dataframe_to_rows

# 把列表里的单键字典展开成分类名和DataFrame的映射
cat_map = {}
for item in db:
    for cat_name, cat_df in item.items():
        cat_map[cat_name] = cat_df

2. 导出对齐排版的CSV文件

适合不需要复杂格式、快速出结果的场景

# 按列方向拼接所有DataFrame,自动按行索引对齐
combined_df = pd.concat(cat_map.values(), axis=1)

# 构造顶部分类标题行:每个分类名放在对应块的起始列位置,块内其余同行位置补空
title_row = []
for cat_name, cat_df in cat_map.items():
    col_count = cat_df.shape[1]
    title_row.extend([cat_name] + [''] * (col_count - 1))

# 把标题行拼到表格最前面
final_df = pd.concat(
    [pd.DataFrame([title_row], columns=combined_df.columns), combined_df],
    ignore_index=True
)

# 导出文件
final_df.to_csv('export_result.csv', index=False)

3. 导出带合并单元格的Excel文件

适合需要规范排版、分类标题做跨列居中合并的正式导出场景

with pd.ExcelWriter('export_result.xlsx', engine='openpyxl') as writer:
    workbook = writer.book
    worksheet = workbook.create_sheet('导出结果', 0)
    
    current_row = 0
    current_col = 0
    # 逐块写入每个分类的内容
    for cat_name, cat_df in cat_map.items():
        col_count = cat_df.shape[1]
        # 写入分类标题,实现跨列合并
        worksheet.cell(row=current_row + 1, column=current_col + 1, value=cat_name)
        worksheet.merge_cells(
            start_row=current_row + 1,
            start_column=current_col + 1,
            end_row=current_row + 1,
            end_column=current_col + col_count
        )
        # 写入当前分类的表头和数据,自动对齐原行索引
        for r_offset, row in enumerate(dataframe_to_rows(cat_df, index=True, header=True)):
            for c_offset, value in enumerate(row):
                worksheet.cell(
                    row=current_row + 2 + r_offset,
                    column=current_col + 1 + c_offset,
                    value=value
                )
        # 偏移列位置,准备写下一个分类块
        current_col += col_count

注意事项

  • 代码兼容原结构中存在的重复列名场景(比如Cat4的重复DB_Field7、Cat5的重复DB_Field13),拼接过程会完整保留所有列,不会因为列名重复自动合并内容
  • 原DataFrame中的NaN值会在导出时自动对应为空单元格,和预期效果一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 07:06:09