无需使用XlsxWriter,基于Pandas DataFrame合并同值行并导出Excel
解决Pandas合并相同Name和Bag行并导出Excel的方法
1. 数据层面合并(聚合相同组的Serial Number)
通过groupby按Name和Bag分组,将同一组的Serial Number合并为单个值(比如用逗号分隔):
import pandas as pd # 创建示例DataFrame df = pd.DataFrame({ ' Name': ['ravi', 'ravi', 'manu'], 'Bag': ['123', '123', '129'], 'Serial Number': ['336', '337','335'] }) # 清理列名的空格(原列名' Name'前面有空格) df.columns = df.columns.str.strip() # 分组聚合:按Name和Bag分组,合并Serial Number merged_df = df.groupby(['Name', 'Bag'], as_index=False)['Serial Number'].agg(', '.join) # 导出到Excel merged_df.to_excel('merged_data.xlsx', index=False)
执行后生成的Excel中,ravi与Bag=123的行将合并为一行,Serial Number显示为336, 337。
2. Excel格式层面的单元格合并(可视化合并)
如果需要让Name和Bag列的相同值单元格可视化跨多行合并,可以借助xlsxwriter引擎设置格式:
import pandas as pd # 初始化数据 df = pd.DataFrame({ ' Name': ['ravi', 'ravi', 'manu'], 'Bag': ['123', '123', '129'], 'Serial Number': ['336', '337','335'] }) df.columns = df.columns.str.strip() # 创建Excel写入对象 writer = pd.ExcelWriter('merged_with_format.xlsx', engine='xlsxwriter') df.to_excel(writer, sheet_name='Sheet1', index=False) workbook = writer.book worksheet = writer.sheets['Sheet1'] # 设置合并单元格的格式(居中+边框) merge_format = workbook.add_format({ 'align': 'center', 'valign': 'vcenter', 'border': 1 }) # 合并Name列相同值的单元格 prev_name = df.iloc[0]['Name'] start_row = 1 # Excel表头在第1行,数据从第2行开始(对应索引1) for row_num in range(1, len(df)+1): current_name = df.iloc[row_num-1]['Name'] if current_name != prev_name: worksheet.merge_range(f'A{start_row}:A{row_num-1}', prev_name, merge_format) prev_name = current_name start_row = row_num # 处理最后一组 worksheet.merge_range(f'A{start_row}:A{len(df)}', prev_name, merge_format) # 合并Bag列相同值的单元格 prev_bag = df.iloc[0]['Bag'] start_row = 1 for row_num in range(1, len(df)+1): current_bag = df.iloc[row_num-1]['Bag'] if current_bag != prev_bag: worksheet.merge_range(f'B{start_row}:B{row_num-1}', prev_bag, merge_format) prev_bag = current_bag start_row = row_num worksheet.merge_range(f'B{start_row}:B{len(df)}', prev_bag, merge_format) # 保存文件 writer.close()
这段代码生成的Excel中,Name列的两个ravi单元格、Bag列的两个123单元格会被合并,同时保留Serial Number的两行数据。
内容的提问来源于stack exchange,提问作者Lenate John
相关产品推荐
相关产品推荐

