如何在Pandas DataFrame中合并两列单元格并添加合计行
在Pandas DataFrame底部添加跨行的总分行
要注意的是,Pandas原生的DataFrame对象本身不支持单元格合并,想要实现“总分”跨“学生ID”和“课程ID”两列的效果,得借助Styler类做样式渲染,同时添加汇总行。下面分两种常用场景给出实现方法:
场景1:在Jupyter或网页中渲染表格
完整代码
import pandas as pd # 构造原始数据 df = pd.DataFrame({ '学生ID': [103, 103, 103], '课程ID': [201, 203, 204], '分数': [67, 67, 89] }) # 计算总分,创建汇总行 total_row = pd.DataFrame({ '学生ID': ['总分'], '课程ID': [''], # 留空,后续用样式隐藏 '分数': [df['分数'].sum()] }) # 把汇总行追加到原表格后面 df_with_total = pd.concat([df, total_row], ignore_index=True) # 定义样式函数,实现跨行效果 def set_total_row_style(styler): # 让最后一行的第一列跨2列显示 styler.set_table_styles([ { 'selector': 'tr:last-child td:first-child', 'props': [('colspan', '2')] }, { 'selector': 'tr:last-child td:nth-child(2)', 'props': [('display', 'none')] } ]) return styler # 渲染出带样式的表格 df_with_total.style.pipe(set_total_row_style)
原理说明
先给表格追加一行总分数据,其中“课程ID”列留空,再通过CSS样式让最后一行的第一列(学生ID列)跨2列,并隐藏第二列(课程ID列),视觉上就实现了“总分”跨两列的效果。
场景2:导出到Excel文件
如果要把结果导出到Excel并保留跨行效果,需要用xlsxwriter引擎处理单元格合并:
import pandas as pd # 构造原始数据和汇总行(和上面步骤一致) df = pd.DataFrame({ '学生ID': [103, 103, 103], '课程ID': [201, 203, 204], '分数': [67, 67, 89] }) total_row = pd.DataFrame({ '学生ID': ['总分'], '课程ID': [''], '分数': [df['分数'].sum()] }) df_with_total = pd.concat([df, total_row], ignore_index=True) # 导出到Excel并设置合并单元格 with pd.ExcelWriter('学生成绩表.xlsx', engine='xlsxwriter') as writer: df_with_total.to_excel(writer, index=False, sheet_name='成绩') workbook = writer.book worksheet = writer.sheets['成绩'] # 获取最后一行的Excel行号(Excel行号从1开始,所以要加2) last_excel_row = len(df_with_total) + 1 # 合并A列和B列的最后一行 worksheet.merge_range(f'A{last_excel_row}:B{last_excel_row}', '总分')
这样导出的Excel文件里,最后一行的“总分”就会跨A、B两列显示。
内容的提问来源于stack exchange,提问作者Prateek Uniyal
相关产品推荐
相关产品推荐

