`pandas.to_latex` - 如何将列名设为粗体

`pandas.to_latex` - how to make column names bold

当我使用 pandas.to_latex 函数创建 Latex table 时,不幸的是列名不是粗体。我该怎么做才能让它变粗?

更新

有人告诉我 on GitHub 这完全可以用普通的 pandas 但是缺少一些文档,将很快更新。

您可以使用下面的行。

result = df.style.applymap_index(
    lambda v: "font-weight: bold;", axis="columns"
).to_latex(convert_css=True)

旧答案

这是一个完整的例子,改编自官方documentation

有一个关键字可以打印粗体列 bold_rows=True。遗憾的是,没有关键字参数可以对列执行相同的操作。但是我可以使用它来检查我的代码是否为 headers.

列提供了相同的结果

我使用 to_latex() 的结果并将其分为三个部分。一个部分是带有列名称的行。在这一行中,我使用正则表达式来添加 \text{} 字符串。仅当您的列名没有空格时,我的代码才有效。

import pandas as pd

df = pd.DataFrame(
    dict(name=['Raphael', 'Donatello'],
         mask=['red', 'purple'],
         weapon=['sai', 'bo staff']
        )
)
ans = df.to_latex(bold_rows=True)

split_middle = '\n\midrule\n'
split_top = '\toprule\n'
top, mid = ans.split(split_middle)
start, columns = top.split(split_top)

columns = re.sub('(\w)+', '\\textbf{\g<0>}', columns)

result = split_middle.join([split_top.join([start, columns]), mid])
>>> result
\begin{tabular}{llll}
\toprule
{} &       \textbf{name} &    \textbf{mask} &    \textbf{weapon} \
\midrule
\textbf{0} &    Raphael &     red &       sai \
\textbf{1} &  Donatello &  purple &  bo staff \
\bottomrule
\end{tabular}

在输出中您可以看到,header 现在是粗体。

根据 mosc9575 操纵 df.to_latex 输出的直觉,您可以使列 header 包含一些独特的分隔符,以便更容易替换。

import re

s = re.sub('<([^>]*)>', '\\textbf{\g<1>}',
           df.rename(columns=lambda x: f'<{x}>').to_latex(index=False))
\begin{tabular}{lll}
\toprule
   \textbf{name} & \textbf{mask} & \textbf{weapon} \
\midrule
  Raphael &    red &      sai \
Donatello & purple & bo staff \
\bottomrule
\end{tabular}

这里给出的答案有些多余。您可以使用 pandas.Styler 实现。

styler = df.style
styler.applymap_index(lambda v: "font-weight: bold;", axis="index")
styler.applymap_index(lambda v: "font-weight: bold;", axis="columns")
styler.to_latex(convert_css=True)

Styler.to_latex 的文档提供了其他方法,如果您想自定义 LaTeX 粗体功能,例如例如,使用 \textbf{} 而不是 \bfseries

Styler 实现最终旨在取代旧的和不太灵活的 DataFrame.LatexFormatter