`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
当我使用 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