Pandas+SQLAlchemy:为重复客户端生成同一Excel工作簿且不覆盖
按客户端名称合并生成Excel工作簿
问题背景
我有一个包含「客户端名称」列的Pandas DataFrame,需用该列过滤SQLAlchemy查询。DataFrame中存在重复甚至三重重复的客户端名称,目标是每个客户端对应一个Excel工作簿,将该客户端的所有相关内容存入同一文件,而非为每个重复项单独生成文件。
当前使用的查询代码(存在重复生成文件的问题):
for index, row in df.iterrows(): clients = (session.query(Client).filter(Client.name == row['Name']).all()) for client in clients: ...
这段代码可正常运行,但会为DataFrame中的每个客户端实例生成独立文件,重复客户端会产出多个文件,不符合需求。我尝试过用以下代码筛选重复客户端,但不知如何整合到逻辑中:
df.groupby('Name').filter(lambda x: len(x) > 2)
解决方案
核心思路是先提取唯一客户端名称,再批量查询每个客户端的全量数据,最后统一写入对应Excel文件,避免重复生成和覆盖。
步骤1:提取唯一客户端名称
跳过逐行遍历,直接获取DataFrame中不重复的客户端名称列表:
unique_client_names = df['Name'].unique().tolist()
步骤2:遍历唯一名称,生成合并后的Excel文件
使用openpyxl引擎实现文件存在时追加、不存在时新建的逻辑:
from openpyxl import load_workbook import pandas as pd for client_name in unique_client_names: # 查询该客户端的所有关联数据 clients = session.query(Client).filter(Client.name == client_name).all() # 将查询结果转换为DataFrame(根据你的实际数据结构调整字段) client_records = pd.DataFrame([ { '客户端ID': c.id, '客户端名称': c.name, '其他字段': c.your_field_name # 替换为你的实际字段 } for c in clients ]) # 定义目标Excel文件名 excel_path = f"{client_name}_数据汇总.xlsx" try: # 加载已有工作簿,追加数据(若工作表存在则替换) book = load_workbook(excel_path) writer = pd.ExcelWriter( excel_path, engine='openpyxl', mode='a', if_sheet_exists='replace' ) client_records.to_excel(writer, sheet_name='数据详情', index=False) writer.close() except FileNotFoundError: # 文件不存在时,新建工作簿并写入数据 client_records.to_excel(excel_path, sheet_name='数据详情', index=False)
关键说明
- 用
unique()去重后,每个客户端仅处理一次,彻底避免重复生成文件 - 通过
openpyxl的mode='a'实现追加写入,不会覆盖已有文件内容 - 若需要将同一个客户端的不同实例拆分到不同工作表,可动态调整
sheet_name参数(比如加入实例ID)
内容的提问来源于stack exchange,提问作者marquês
相关产品推荐
相关产品推荐

