使用pandas合并Excel中DataFrame连续相同值单元格时Year/Color列异常
问题排查与修复:DataFrame导出Excel时连续相同值单元格合并错误
问题根源分析
- 变量名拼写错误:函数参数定义为
columntomerge,但内部误用了未定义的columnname,导致逻辑执行混乱。 - 分组逻辑错误:原代码使用
groupby(df[columntomerge])会将所有相同值的行(无论是否连续)归为一组,而非仅连续的相同值行,这会生成无效的跨区域合并范围,进而触发Excel文件损坏提示。
修复后的完整代码
import pandas as pd from pandas import ExcelWriter # 原始DataFrame df = pd.DataFrame({'Name': ['Tesla','Tesla','Tesla','Toyota','Ford','Ford','Ford','BMW','BMW','BMW','Mercedes','Mercedes','Mercedes'], 'Type': ['Model X','Model X','Model X','Corolla','Bronco','Bronco','Mustang','3 Series','3 Series','7 Series','C-Class','C-Class','S-Class'], 'Year': [2015, 2015, 2015, 2017, 2018, 2018, 2020, 2015, 2015, 2017, 2018, 2018, 2020], 'Price': [85000, 90000, 95000, 20000, 35000, 35000, 45000, 40000, 40000, 65000, 50000, 50000, 75000], 'Color': ['White','White','White','Red','Blue','Blue','Yellow','Silver','Silver','Black','White','White','Black'] }) def mergecells(df, columntomerge, sheetname, writer): # 生成连续相同值的分组标签:当前行与上一行值不同时,分组标签+1 group_labels = (df[columntomerge] != df[columntomerge].shift()).cumsum() # 按分组标签聚合,获取每组的首尾索引 group_ranges = df.index.to_series().groupby(group_labels).agg(['first', 'last']) wb = writer.book ws = writer.sheets[sheetname] mf = wb.add_format({'align': 'center', 'valign': 'vcenter'}) col_idx = df.columns.get_loc(columntomerge) for _, row in group_ranges.iterrows(): first_row = row['first'] + 1 # 转换为Excel的1-based行号 last_row = row['last'] + 1 cell_value = df.loc[row['first'], columntomerge] # 仅合并多行的情况,跳过单行无效合并 if first_row != last_row: ws.merge_range(first_row, col_idx, last_row, col_idx, cell_value, mf) # 导出Excel并应用合并逻辑 with ExcelWriter('merged_cars.xlsx', engine='xlsxwriter') as writer: df.to_excel(writer, sheet_name='Trial', index=False) for col in df.columns: mergecells(df, col, 'Trial', writer)
修复说明
- 连续分组逻辑:通过
shift()对比当前行与上一行的值,生成累计分组标签,确保只有连续相同值的行被归为同一组,解决了Year、Color列跨区域合并的错误。 - 变量名修正:统一使用参数
columntomerge,消除未定义变量的语法错误。 - 合并范围校验:仅当分组包含多行时执行合并,避免无效的单行合并操作,减少Excel文件的异常触发点。
- 行号适配:将DataFrame的0-based索引转换为Excel的1-based行号,确保合并范围与Excel实际单元格位置匹配。
内容的提问来源于stack exchange,提问作者Sudeep George
相关产品推荐
相关产品推荐

