Table formatting with pandas Dataframe.to_latex()

Viewed 507

Is there any way to instruct pandas Dataframe.to_latex() to append \footnotesize (or other global options) for the output table in LateX? (Of course, other than manually append it, which is not efficient, as I'm generating lots of tables.)

So, right now my code produces the following LaTeX table:

\begin{table}[H]
\centering
\caption{Caption of the table.}
\label{tab:06_01.example}
\begin{tabular}{lrrr}
\toprule
                    &            &  F-1 &    F-2 \\
Dataset & Model &            &       \\
\midrule
\multirow{2}{*}{\textit{H}} & Baseline &      0.904 & 0.887 \\
                    & Version2 &      0.939 & 0.927 \\
\cline{1-4}
\multirow{2}{*}{\textit{S}} & Baseline &      0.548 & 0.506 \\
                    & Version2 &      0.582 & 0.541 \\
\cline{1-4}
\midrule
\multirow{2}{*}{\textit{G}} & Baseline &      0.879 & 0.855 \\
                    & Version2 &      0.910 & 0.895 \\
\cline{1-4}
\multirow{2}{*}{\textit{T}} & Baseline &      0.911 & 0.877 \\
                    & Version2 &      0.940 & 0.913 \\
\bottomrule
\end{tabular}
\end{table}

from the following pandas dataframe:

                     F-1   F-2
dataset Model                 
H       Baseline   0.904 0.887
        Version2   0.939 0.927
S       Baseline   0.548 0.506
        Version2   0.582 0.541
G       Baseline   0.879 0.855
        Version2   0.910 0.895
T       Baseline   0.911 0.877
        Version2   0.940 0.913

and the corresponding dict for reproducibility purposes:

{'F-1': {('H', 'Baseline'): 0.9044961552465764, ('H', 'Fine-Tuned'): 0.9387767951280728, ('S', 'Baseline'): 0.547968262581014, ('S', 'Fine-Tuned'): 0.5815634664656218, ('G', 'Baseline'): 0.8793941208568047, ('G', 'Fine-Tuned'): 0.9102870296052078, ('T', 'Baseline'): 0.9110316123313993, ('T', 'Fine-Tuned'): 0.9404444309041384}, 'F-2': {('H', 'Baseline'): 0.8865304318012182, ('H', 'Fine-Tuned'): 0.9273671656403047, ('S', 'Baseline'): 0.5063582247873787, ('S', 'Fine-Tuned'): 0.5408162758046822, ('G', 'Baseline'): 0.8551648617281388, ('G', 'Fine-Tuned'): 0.8947135188980437, ('T', 'Baseline'): 0.8774834363467384, ('T', 'Fine-Tuned'): 0.9134634736945935}}

through an almost direct dataframe.to_latex(). What I would like is to change some global table options, e.g. add \footnotesize, change \centering, like this:

\begin{table}[H]
\footnotesize %include or not
\centering %include or not
\caption{Caption of the table.}
\label{tab:06_01.example}
\begin{tabular}{lrrr}
\toprule
                    &            &  F-1 &    F-2 \\
Dataset & Model &            &       \\
\midrule
\multirow{2}{*}{\textit{H}} & Baseline &      0.904 & 0.887 \\
                    & Version2 &      0.939 & 0.927 \\
\cline{1-4}
\multirow{2}{*}{\textit{S}} & Baseline &      0.548 & 0.506 \\
                    & Version2 &      0.582 & 0.541 \\
\cline{1-4}
\multirow{2}{*}{\textit{G}} & Baseline &      0.879 & 0.855 \\
                    & Version2 &      0.910 & 0.895 \\
\cline{1-4}
\multirow{2}{*}{\textit{T}} & Baseline &      0.911 & 0.877 \\
                    & Version2 &      0.940 & 0.913 \\
\bottomrule
\end{tabular}
\end{table}

At 1st sight, it seems that there isn't such an option within Dataframe.to_latex(), but I'm not sure about what formatters field can do. Furthermore, I don't know if Styler.to_latex() could help here.

PS: An additional nice-to-have would be to define after which datasets (e.g. S) to include a \midrule (as I would like to separate different types of datasets).

\begin{table}[H]
\footnotesize %include or not
\centering %include or not
\caption{Caption of the table.}
\label{tab:06_01.example}
\begin{tabular}{lrrr}
\toprule
                    &            &  F-1 &    F-2 \\
Dataset & Model &            &       \\
\midrule
\multirow{2}{*}{\textit{H}} & Baseline &      0.904 & 0.887 \\
                    & Version2 &      0.939 & 0.927 \\
\cline{1-4}
\multirow{2}{*}{\textit{S}} & Baseline &      0.548 & 0.506 \\
                    & Version2 &      0.582 & 0.541 \\
\cline{1-4}
\midrule
\multirow{2}{*}{\textit{G}} & Baseline &      0.879 & 0.855 \\
                    & Version2 &      0.910 & 0.895 \\
\cline{1-4}
\multirow{2}{*}{\textit{T}} & Baseline &      0.911 & 0.877 \\
                    & Version2 &      0.940 & 0.913 \\
\bottomrule
\end{tabular}
\end{table}
1 Answers

You can tell latex to make these changes for all your tables:

\documentclass{article}

\usepackage{float}
\usepackage{booktabs}
\usepackage{multirow}

% change fontsize
\AtBeginEnvironment{tabular}{\footnotesize} 

% switch off centering in tables
\AtBeginEnvironment{table}{\let\centering\relax}

\begin{document}

\begin{table}[H]
\centering
\caption{Caption of the table.}
\label{tab:06_01.example}
\begin{tabular}{lrrr}
\toprule
                    &            &  F-1 &    F-2 \\
Dataset & Model &            &       \\
\midrule
\multirow{2}{*}{\textit{H}} & Baseline &      0.904 & 0.887 \\
                    & Version2 &      0.939 & 0.927 \\
\cline{1-4}
\multirow{2}{*}{\textit{S}} & Baseline &      0.548 & 0.506 \\
                    & Version2 &      0.582 & 0.541 \\
\cline{1-4}
\midrule
\multirow{2}{*}{\textit{G}} & Baseline &      0.879 & 0.855 \\
                    & Version2 &      0.910 & 0.895 \\
\cline{1-4}
\multirow{2}{*}{\textit{T}} & Baseline &      0.911 & 0.877 \\
                    & Version2 &      0.940 & 0.913 \\
\bottomrule
\end{tabular}
\end{table}

test

\centering


test

\end{document}
Related