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

如何在Pandas style.to_latex生成的表头中添加\cmidrule?

问题描述

我有文件mycsv.csv,内容如下:

Nr,A,B,C
1,a,b,g
2,c,d,h
3,e,f,i

使用以下Python代码生成LaTeX表格:

import pandas as pd

testo = pd.read_csv("mycsv.csv")
columns = [
    ('','Something'),
    ('Multicolumn','A'),
    ('Multicolumn','B'),   
    ('Something else',''),   
]
testo.columns = pd.MultiIndex.from_tuples(columns)
testo.style.hide(axis="index").to_latex("myout.tex", hrules=True,
                                       multicol_align='c')

生成的myout.tex内容为:

\begin{tabular}{rlll}
\toprule
 & \multicolumn{2}{c}{Multicolumn} & Something else \\
Something & A & B &  \\
\midrule
1 & a & b & g \\
2 & c & d & h \\
3 & e & f & i \\
\bottomrule
\end{tabular}

需要在表头中添加\cmidrule{2-3},最终效果如下:

\documentclass[10pt]{article}
\usepackage{booktabs}
\begin{document}
\begin{tabular}{rlll}
\toprule
 & \multicolumn{2}{c}{Multicolumn} & Something else \\
\cmidrule{2-3}
Something & A & B &  \\
\midrule
1 & a & b & g \\
2 & c & d & h \\
3 & e & f & i \\
\bottomrule
\end{tabular}

\end{document}

请问该如何实现?

解决方案

方法1:直接修改生成的LaTeX文件

这种方法简单直接,在生成LaTeX文件后,读取内容并插入\cmidrule{2-3}到指定位置:

import pandas as pd

# 原代码:生成初始LaTeX文件
testo = pd.read_csv("mycsv.csv")
columns = [
    ('','Something'),
    ('Multicolumn','A'),
    ('Multicolumn','B'),   
    ('Something else',''),   
]
testo.columns = pd.MultiIndex.from_tuples(columns)
testo.style.hide(axis="index").to_latex("myout.tex", hrules=True, multicol_align='c')

# 读取并修改LaTeX内容
with open("myout.tex", "r") as f:
    lines = f.readlines()

# 定位到包含multicolumn的表头行,在其下一行插入cmidrule
insert_position = None
for idx, line in enumerate(lines):
    if '\multicolumn{2}{c}{Multicolumn}' in line:
        insert_position = idx + 1
        break

if insert_position is not None:
    lines.insert(insert_position, '\\cmidrule{2-3}\n')

# 写入修改后的内容
with open("myout.tex", "w") as f:
    f.writelines(lines)

方法2:通过Styler自定义表头样式

利用pandas Styler的表格样式配置,为指定表头列添加底部边框,最终转换为LaTeX的\cmidrule:

import pandas as pd

testo = pd.read_csv("mycsv.csv")
columns = [
    ('','Something'),
    ('Multicolumn','A'),
    ('Multicolumn','B'),   
    ('Something else',''),   
]
testo.columns = pd.MultiIndex.from_tuples(columns)

# 配置表头样式,为第二、第三列的第一行表头添加底部边框
style_obj = testo.style.hide(axis="index")
style_obj.set_table_styles([
    {'selector': 'thead tr:first-child th:nth-child(2)', 'props': [('border-bottom', '1pt solid')]},
    {'selector': 'thead tr:first-child th:nth-child(3)', 'props': [('border-bottom', '1pt solid')]},
], overwrite=False)

# 生成带cmidrule的LaTeX文件
style_obj.to_latex("myout.tex", hrules=True, multicol_align='c')

注:方法1的兼容性和可控性更强,方法2依赖pandas对CSS样式到LaTeX的转换逻辑,部分版本可能存在差异。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 18:55:14