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

使用pandas.to_latex()时如何处理MultiIndex并调整表格输出格式?

解决方案

实现逻辑

你需要的效果可以通过以下纯Python端操作实现,无需修改输出后的LaTeX代码:

  1. 聚合数据后重置索引,保证表头dataset、Model、F-1、F-2在同一行
  2. 去重dataset列的重复值,仅保留每个分组第一个出现的取值
  3. 拆分生成的基础LaTeX代码,在每个dataset分组的末尾插入\midrule(注:你提到的\midrow为笔误,标准booktabs宏包的水平分隔线命令为\midrule)

完整可运行代码

import pandas as pd
from pathlib import Path

# 配置路径和文件名,按需修改
tbl_path = Path("./")
filename = "result_table"

# 测试数据,实际使用时替换为 df = pd.read_pickle("org_df.pkl")
this_dict={'Model': {0: 'Baseline', 1: 'Baseline', 2: 'Baseline', 3: 'Baseline', 4: 'Baseline', 5: 'Baseline', 6: 'Baseline', 7: 'Baseline', 8: 'Baseline', 9: 'Baseline', 10: 'Baseline', 11: 'Baseline', 12: 'Baseline', 13: 'Baseline', 14: 'Baseline', 15: 'Baseline', 16: 'Baseline', 17: 'Baseline', 18: 'Baseline', 19: 'Baseline', 20: 'Baseline', 21: 'Baseline', 22: 'Baseline', 23: 'Baseline', 24: 'Version2', 25: 'Version2', 26: 'Version2', 27: 'Version2', 28: 'Version2', 29: 'Version2', 30: 'Version2', 31: 'Version2', 32: 'Version2', 33: 'Version2', 34: 'Version2', 35: 'Version2', 36: 'Version2', 37: 'Version2', 38: 'Version2', 39: 'Version2', 40: 'Version2', 41: 'Version2', 42: 'Version2', 43: 'Version2', 44: 'Version2', 45: 'Version2', 46: 'Version2', 47: 'Version2'}, 'dataset': {0: 'H', 1: 'H', 2: 'H', 3: 'H', 4: 'H', 5: 'H', 6: 'S', 7: 'S', 8: 'S', 9: 'S', 10: 'S', 11: 'S', 12: 'G', 13: 'G', 14: 'G', 15: 'G', 16: 'G', 17: 'G', 18: 'T', 19: 'T', 20: 'T', 21: 'T', 22: 'T', 23: 'T', 24: 'H', 25: 'H', 26: 'H', 27: 'H', 28: 'H', 29: 'H', 30: 'S', 31: 'S', 32: 'S', 33: 'S', 34: 'S', 35: 'S', 36: 'G', 37: 'G', 38: 'G', 39: 'G', 40: 'G', 41: 'G', 42: 'T', 43: 'T', 44: 'T', 45: 'T', 46: 'T', 47: 'T'}, 'F-1': {0: 1.0, 1: 0.2983425414364641, 2: 1.0, 3: 0.4705882352941177, 4: 0.9245283018867924, 5: 0.9836065573770492, 6: 0.4927536231884056, 7: 0.3589743589743589, 8: 0.3689320388349514, 9: 0.4375, 10: 0.2758620689655172, 11: 0.4722222222222222, 12: 0.9761904761904762, 13: 1.0, 14: 0.9902912621359222, 15: 1.0, 16: 0.9887640449438202, 17: 0.8695652173913043, 18: 0.9690721649484536, 19: 0.663013698630137, 20: 0.9987325728770596, 21: 0.9991015274034142, 22: 1.0, 23: 0.654320987654321, 24: 1.0, 25: 0.3296703296703296, 26: 1.0, 27: 0.5263157894736842, 28: 0.9622641509433962, 29: 0.9836065573770492, 30: 0.5217391304347826, 31: 0.3589743589743589, 32: 0.4901960784313725, 33: 0.5161290322580646, 34: 0.3103448275862069, 35: 0.5217391304347826, 36: 0.9761904761904762, 37: 1.0, 38: 0.9902912621359222, 39: 1.0, 40: 0.9887640449438202, 41: 0.8695652173913043, 42: 0.9690721649484536, 43: 0.9877800407331976, 44: 0.9962073324905184, 45: 0.9991015274034142, 46: 1.0, 47: 0.979214780600462}, 'F-2': {0: 1.0, 1: 0.2967032967032967, 2: 1.0, 3: 0.3711340206185567, 4: 0.9245283018867924, 5: 0.9782608695652174, 6: 0.3695652173913043, 7: 0.3191489361702128, 8: 0.2714285714285714, 9: 0.3888888888888889, 10: 0.2105263157894736, 11: 0.3617021276595745, 12: 0.9761904761904762, 13: 1.0, 14: 0.9807692307692308, 15: 1.0, 16: 0.9777777777777776, 17: 0.8695652173913043, 18: 0.9657534246575342, 19: 0.4969199178644763, 20: 0.9974683544303796, 21: 0.9982046678635548, 22: 1.0, 23: 0.4907407407407407, 24: 1.0, 25: 0.3260869565217391, 26: 1.0, 27: 0.4123711340206185, 28: 0.9433962264150944, 29: 0.9782608695652174, 30: 0.391304347826087, 31: 0.3191489361702128, 32: 0.3623188405797101, 33: 0.4705882352941176, 34: 0.2368421052631578, 35: 0.4090909090909091, 36: 0.9761904761904762, 37: 1.0, 38: 0.9807692307692308, 39: 1.0, 40: 0.9777777777777776, 41: 0.8695652173913043, 42: 0.9657534246575342, 43: 0.9758551307847082, 44: 0.9924433249370276, 45: 0.9982046678635548, 46: 1.0, 47: 0.976958525345622}}
df = pd.DataFrame.from_dict(this_dict)

# 聚合计算
df_all_print = df.groupby(['dataset', 'Model']).mean().reset_index()
# 按dataset排序保证分组连续,若你的数据本身已经有序可省略
df_all_print = df_all_print.sort_values('dataset', ascending=True)

# 去重dataset列,仅保留每个分组第一个取值
df_all_print['dataset'] = df_all_print['dataset'].mask(df_all_print['dataset'].duplicated(), '')

# 生成基础LaTeX代码
latex_lines = df_all_print.to_latex(
    index=False,
    escape=False,
    position='H',
    column_format='llrr' # 可按需调整列格式:前两列左对齐,后两列数值右对齐
).split('\n')

# 定位内容行起始位置
content_start_idx = None
for idx, line in enumerate(latex_lines):
    if line.strip() == '\\midrule':
        content_start_idx = idx + 1
        break

# 计算每个dataset分组的结束位置,排除最后一个分组不需要加分隔线
group_sizes = df_all_print.groupby('dataset', sort=False).size().cumsum().tolist()
insert_positions = [content_start_idx + pos for pos in group_sizes[:-1]]

# 倒序插入分隔线避免位置偏移
for pos in reversed(insert_positions):
    latex_lines.insert(pos, '\\midrule')

# 输出最终LaTeX文件
final_latex = '\n'.join(latex_lines)
with open(tbl_path / f'{filename}.tex', 'w') as f:
    f.write(final_latex)

问题解答

  • 可以自定义在指定行后添加分隔线:上述方案通过拆分LaTeX代码为行列表、定位指定位置插入的方式实现,支持任意位置的自定义分隔线添加。
  • 上述完整代码即可实现你需要的表格样式:表头四个字段在同一行,同dataset取值仅展示一次,分组之间有分隔线,所有处理均在Python端完成,无需额外修改LaTeX代码。

内容的提问来源于stack exchange,提问作者MrT77

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:15:04