如何在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
相关产品推荐
相关产品推荐

