如何将含嵌套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
相关产品推荐
相关产品推荐

