在Python中,将多个DataFrame合并到一个Excel工作表的sheet中有几种方法。以下是常见的几种实现方式:
方法1:直接合并DataFrame后保存
import pandas as pd# 示例数据
df1 = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df2 = pd.DataFrame({'C': [7, 8, 9], 'D': [10, 11, 12]})
df3 = pd.DataFrame({'E': [13, 14, 15], 'F': [16, 17, 18]})# 方法1.1:纵向合并(行合并)
result = pd.concat([df1, df2, df3], axis=0) # axis=0 按行合并
result.to_excel('merged_vertical.xlsx', index=False, sheet_name='Merged_Data')# 方法1.2:横向合并(列合并)
result = pd.concat([df1, df2, df3], axis=1) # axis=1 按列合并
result.to_excel('merged_horizontal.xlsx', index=False, sheet_name='Merged_Data')
实践:
merged_vertical.xlsx 文件:
merged_horizontal.xlsx文件:
方法2:使用ExcelWriter进行更灵活的控制
import pandas as pd
from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows# 示例数据
df1 = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df2 = pd.DataFrame({'C': [7, 8, 9], 'D': [10, 11, 12]})
df3 = pd.DataFrame({'E': [13, 14, 15], 'F': [16, 17, 18]})# 创建一个新的Excel文件
with pd.ExcelWriter('merged_data.xlsx', engine='openpyxl') as writer:# 先写入第一个DataFramedf1.to_excel(writer, sheet_name='Combined', index=False, startrow=0)# 获取当前工作表workbook = writer.bookworksheet = writer.sheets['Combined']# 计算下一个DataFrame的起始位置start_row = len(df1) + 2 # +2是为了在DataFrame之间留一个空行# 写入第二个DataFramedf2.to_excel(writer, sheet_name='Combined', index=False, startrow=start_row)# 更新起始位置start_row += len(df2) + 2# 写入第三个DataFramedf3.to_excel(writer, sheet_name='Combined', index=False, startrow=start_row)
方法3:使用openpyxl直接操作
import pandas as pd
from openpyxl import Workbook
from openpyxl.utils.dataframe import dataframe_to_rowsdef merge_dataframes_to_sheet(dataframes, filename, sheet_name='Merged_Data'):"""将多个DataFrame合并到一个Excel工作表中Parameters:dataframes: list of DataFrames - 要合并的DataFrame列表filename: str - 输出文件名sheet_name: str - 工作表名称"""# 创建工作簿和工作表wb = Workbook()ws = wb.activews.title = sheet_namecurrent_row = 1for i, df in enumerate(dataframes):# 添加DataFrame名称作为标题(可选)if hasattr(df, 'name') and df.name:ws.cell(row=current_row, column=1, value=f"DataFrame: {df.name}")current_row += 1# 写入DataFrame数据for r in dataframe_to_rows(df, index=False, header=True):for c, value in enumerate(r, 1):ws.cell(row=current_row, column=c, value=value)current_row += 1# 在DataFrame之间添加空行(除了最后一个)if i < len(dataframes) - 1:current_row += 1# 保存文件wb.save(filename)# 使用示例
df1 = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df2 = pd.DataFrame({'C': [7, 8, 9], 'D': [10, 11, 12]})
df3 = pd.DataFrame({'E': [13, 14, 15], 'F': [16, 17, 18]})merge_dataframes_to_sheet([df1, df2, df3], 'merged_dataframes.xlsx')
方法4:更高级的合并函数
import pandas as pd
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment
from openpyxl.utils.dataframe import dataframe_to_rowsdef advanced_merge_to_sheet(dataframes, filename, sheet_name='Merged_Data', add_titles=True, spacing=1):"""高级合并函数,支持更多自定义选项Parameters:dataframes: list of DataFrames - 要合并的DataFrame列表filename: str - 输出文件名sheet_name: str - 工作表名称add_titles: bool - 是否添加DataFrame标题spacing: int - DataFrame之间的空行数"""wb = Workbook()ws = wb.activews.title = sheet_namecurrent_row = 1for i, df in enumerate(dataframes):# 添加标题if add_titles:title_cell = ws.cell(row=current_row, column=1, value=f"DataFrame {i+1}")title_cell.font = Font(bold=True, size=12)title_cell.alignment = Alignment(horizontal='left')current_row += 1# 写入表头header_row = list(df.columns)for col_idx, header in enumerate(header_row, 1):cell = ws.cell(row=current_row, column=col_idx, value=header)cell.font = Font(bold=True)current_row += 1# 写入数据for _, row in df.iterrows():for col_idx, value in enumerate(row, 1):ws.cell(row=current_row, column=col_idx, value=value)current_row += 1# 添加间距if i < len(dataframes) - 1:current_row += spacing# 自动调整列宽for column in ws.columns:max_length = 0column_letter = column[0].column_letterfor cell in column:try:if len(str(cell.value)) > max_length:max_length = len(str(cell.value))except:passadjusted_width = (max_length + 2)ws.column_dimensions[column_letter].width = adjusted_widthwb.save(filename)# 使用示例
df1 = pd.DataFrame({'姓名': ['张三', '李四', '王五'], '年龄': [25, 30, 35]})
df2 = pd.DataFrame({'城市': ['北京', '上海', '广州'], '工资': [10000, 12000, 9000]})
df3 = pd.DataFrame({'部门': ['技术部', '销售部', '人事部'], '工龄': [3, 5, 2]})advanced_merge_to_sheet([df1, df2, df3], 'advanced_merged.xlsx', add_titles=True, spacing=2)
方法5:使用xlsxwriter引擎
import pandas as pddef merge_with_xlsxwriter(dataframes, filename, sheet_name='Merged_Data'):"""使用xlsxwriter引擎合并DataFrame"""with pd.ExcelWriter(filename, engine='xlsxwriter') as writer:workbook = writer.bookworksheet = workbook.add_worksheet(sheet_name)start_row = 0for i, df in enumerate(dataframes):# 写入DataFramedf.to_excel(writer, sheet_name=sheet_name, startrow=start_row, index=False)# 更新起始行位置start_row += len(df) + 2 # +2 用于表头和空行# 使用示例
df1 = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df2 = pd.DataFrame({'C': [7, 8, 9], 'D': [10, 11, 12]})merge_with_xlsxwriter([df1, df2], 'xlsxwriter_merged.xlsx')
xlsxwriter_merged.xlsx 文件结果:
选择哪种方法取决于你的具体需求:
-
方法1:适合简单的行或列合并
-
方法2:适合需要精确控制位置的情况
-
方法3:提供最大的灵活性
-
方法4:适合需要格式化的专业输出
-
方法5:适合使用xlsxwriter的高级功能
根据你的具体需求选择最合适的方法即可。