如何对Pandas DataFrame按name和index排序并导出至Excel模板指定位置
实现方案
1. 数据排序处理
先构造并排序目标DataFrame:
import pandas as pd # 构造示例数据 data = { 'name': ['A', 'B', 'A', 'A', 'B', 'C'], 'index': [1, 1, 2, 3, 2, 1], 'val_a': [0.1, 1.1, 1.5, 7.7, 3.9, 5.8], 'val_b': [0.2, 3.2, 9.9, 7.6, 3.4, 2.4], 'val_c': [0.3, 2.3, 4.5, 4.9, 2.3, 1.3] } df = pd.DataFrame(data) # 按name和index升序排序 sorted_df = df.sort_values(by=['name', 'index']).reset_index(drop=True)
2. 写入Excel模板
使用openpyxl加载模板(保留原有格式),按name分组写入对应工作表的C列开始位置:
from openpyxl import load_workbook # 替换为你的模板路径和输出路径 template_path = "模板文件.xlsx" output_path = "填充完成.xlsx" # 加载模板工作簿 wb = load_workbook(template_path) # 遍历每个name分组 for name, group in sorted_df.groupby('name'): # 匹配对应工作表(假设工作表名与name值一致,如'A'对应工作表'A') if name in wb.sheetnames: ws = wb[name] # 提取需要写入的列:val_a、val_b、val_c write_data = group[['val_a', 'val_b', 'val_c']].values.tolist() # 从C列(openpyxl列索引为3)第1行开始写入,若模板有表头可改为start_row=2 start_row, start_col = 1, 3 # 逐行填充数据 for row_idx, row_content in enumerate(write_data, start=start_row): for col_idx, value in enumerate(row_content, start=start_col): ws.cell(row=row_idx, column=col_idx, value=value) # 保存结果 wb.save(output_path)
关键注意点
- 若模板工作表名与
name值不匹配,可添加映射字典(如name_sheet_map = {'A': '客户A数据', 'B': '客户B数据'})来关联分组与工作表。 - 若模板C列需要从指定行开始写入(比如跳过表头行),调整
start_row参数即可。 - 使用
openpyxl而非pandas默认写入方式,能完整保留模板的单元格格式、公式等原有内容。
内容的提问来源于stack exchange,提问作者jasondesu
相关产品推荐
相关产品推荐

