为什么我的 pandas 数据框表无法呈现在我的 tex 文件中?

为什么我的 pandas 数据框表无法呈现在我的 tex 文件中?

我正在尝试生成一个带有由 Pandas 数据框生成的表的乳胶文件,但没有成功。

我正在使用 pylatex 库来生成整个文件

示例代码如下:

geometry_options = {"tmargin": "1cm", "lmargin": "10cm"}
doc = Document(geometry_options=geometry_options)

with doc.create(Section("Top 10 canales")) as target:
    target.append(df.to_latex())

doc.generate_pdf('full', clean_tex=False)

的输出print(df.to_latex())为:

\begin{tabular}{lr}
\toprule
{} &    ATCCO \\
\midrule
All channels        &  16395.0 \\
OLATV\_El Trece      &   4421.0 \\
OLATV\_TN            &   2801.0 \\
OLATV\_Telefe        &   2113.0 \\
OLATV\_ESPN 2        &   1632.0 \\
OLATV\_Atcco Canal 2 &   1361.0 \\
OLATV\_America       &    925.0 \\
TV Publica          &    838.0 \\
OLATV\_Fox Sports 2  &    536.0 \\
OLATV\_ESPN          &    497.0 \\
\bottomrule
\end{tabular}

如果我更改该Section()语句,Tabular()它会在编译成 pdf 时返回错误

最终的tex文件如下:

\documentclass{article}%
\usepackage[T1]{fontenc}%
\usepackage[utf8]{inputenc}%
\usepackage{lmodern}%
\usepackage{textcomp}%
\usepackage{lastpage}%
\usepackage{geometry}%
\geometry{tmargin=1cm,lmargin=10cm}%
%
%
%
\begin{document}%
\normalsize%
\section{Top 10 canales}%
\label{sec:Top10canales}%
\textbackslash{}begin\{tabular\}\{lr\}\newline%
\textbackslash{}toprule\newline%
\{\} \&    ATCCO \textbackslash{}\textbackslash{}\newline%
\textbackslash{}midrule\newline%
All channels        \&  16395.0 \textbackslash{}\textbackslash{}\newline%
OLATV\textbackslash{}\_El Trece      \&   4421.0 \textbackslash{}\textbackslash{}\newline%
OLATV\textbackslash{}\_TN            \&   2801.0 \textbackslash{}\textbackslash{}\newline%
OLATV\textbackslash{}\_Telefe        \&   2113.0 \textbackslash{}\textbackslash{}\newline%
OLATV\textbackslash{}\_ESPN 2        \&   1632.0 \textbackslash{}\textbackslash{}\newline%
OLATV\textbackslash{}\_Atcco Canal 2 \&   1361.0 \textbackslash{}\textbackslash{}\newline%
OLATV\textbackslash{}\_America       \&    925.0 \textbackslash{}\textbackslash{}\newline%
TV Publica          \&    838.0 \textbackslash{}\textbackslash{}\newline%
OLATV\textbackslash{}\_Fox Sports 2  \&    536.0 \textbackslash{}\textbackslash{}\newline%
OLATV\textbackslash{}\_ESPN          \&    497.0 \textbackslash{}\textbackslash{}\newline%
\textbackslash{}bottomrule\newline%
\textbackslash{}end\{tabular\}\newline%

%
\end{document}

无渲染:

在此处输入图片描述

答案1

的输出df.to_latex()是包含 LaTeX 代码的字符串。这不符合 PyLaTeX 的正常处理模型,即使用相关 Python 类(如Document()Section()Tabular())生成文档中的所有元素。 的输入应为常规文本,如果此输入中有任何 LaTeX 符号,则使用、和其他符号Section.append()进行转义。\textbackslash\&

对于这种情况,PyLaTeX 有一个类NoEscape(),可以关闭特殊字符处理。手册页对此进行了进一步解释https://jeltef.github.io/PyLaTeX/current/usage.html#plain-latex-strings. 在这种情况下您需要NoEscape(df.to_latex())

梅威瑟:

from pylatex import Document, Package, Section, NoEscape
import pandas as pd

df = pd.DataFrame([["All channels", 16395],["OLATV_El Trece",4421.0]],columns=["channel", "ATTCCO"])

geometry_options = {"tmargin": "1cm", "lmargin": "10cm"}
doc = Document(geometry_options=geometry_options)
doc.packages.append(Package('booktabs'))

with doc.create(Section("Top 10 canales")) as target:
    target.append(NoEscape(df.to_latex()))

doc.generate_pdf('full', clean_tex=False)

结果:

在此处输入图片描述

请注意,我将booktabs包添加到文档中是因为to_latex()Pandas 需要它。另外,似乎有一个错误导致to_latex()输出中跳过一个空列,因此我还为第一列提供了一个列名。


对于空列名,可以使用以下解决方法to_latex(multicolumn=False),请参阅https://github.com/pandas-dev/pandas/issues/20008。 代码:

df = pd.DataFrame([["All channels", 16395],["OLATV_El Trece",4421.0]],columns=["", "ATTCCO"])

with doc.create(Section("Top 10 canales")) as target:
    target.append(NoEscape(df.to_latex(multicolumn=False)))

结果:

在此处输入图片描述

相关内容