You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 04:15:42