簡體   English   中英

是否有一個函數可以在 pandas 樣式器(DataFrame.style.to_latex)中格式化索引名稱,以便可以轉義乳膠?

[英]Is there a function to format the index name in a pandas styler (DataFrame.style.to_latex) so can escape latex?

我正在嘗試格式化索引名稱,以便在使用.to_latex()時可以轉義乳膠。 使用.format_index()僅適用於索引值,但不適用於索引名稱。

失敗表

這是一個最小的,可重現的例子。

import pandas as pd
import numpy as np
import pylatex as pl

dict1= {
    'employee_w': ['John_Smith','John_Smith','John_Smith', 'Marc_Jones','Marc_Jones', 'Tony_Jeff', 'Maria_Mora','Maria_Mora'],
    'customer&client': ['company_1','company_2','company_3','company_4','company_5','company_6','company_7','company_8'],
    'calendar_week': [18,18,19,21,21,22,23,23],
    'sales': [5,5,5,5,5,5,5,5],
}

df1 = pd.DataFrame(data = dict1)

ptable = pd.pivot_table(
    df1,
    values='sales',
    index=['employee_w','customer&client'],
    columns=['calendar_week'],
    aggfunc=np.sum
)

mystyler = ptable.style
mystyler.format(na_rep='-', precision=0, escape="latex") 
mystyler.format_index(escape="latex", axis=0)
mystyler.format_index(escape="latex", axis=1)

latex_code1 = mystyler.to_latex(
    column_format='|c|c|c|c|c|c|c|',
    multirow_align="t",
    multicol_align="r",
    clines="all;data",
    hrules=True,
)

# latex_code1 = latex_code1.replace("employee_w", "employee")
# latex_code1 = latex_code1.replace("customer&client", "customer and client")
# latex_code1 = latex_code1.replace("calendar_week", "week")

doc = pl.Document(geometry_options=['a4paper'], document_options=["portrait"], textcomp = None) 

doc.packages.append(pl.Package('newtxtext,newtxmath')) 
doc.packages.append(pl.Package('textcomp')) 
doc.packages.append(pl.Package('booktabs'))
doc.packages.append(pl.Package('xcolor',options= pl.NoEscape('table')))
doc.packages.append(pl.Package('multirow'))

doc.append(pl.NoEscape(latex_code1))
doc.generate_pdf('file1.pdf', clean_tex=False, silent=True)

當我使用.replace()替換它們時,它可以工作。 例如注釋行。 (期望的結果): 期望表

但我正在處理數百個索引/列名未知的表。

范圍是使用 Pylatex 自動生成 PDF 文件。 所以任何 html 選項對我都沒有幫助。

提前致謝!

我編寫了所有Styler.to_latex功能,恐怕索引名稱目前沒有格式化,這也意味着它們沒有被轉義。 所以沒有直接的功能可以做你想做的事。 (順便說一句,很高興看到一個例子,其中包括 hrules 表樣式定義在內的許多功能正在被使用)。 實際上,我只是在 Pandas Github 上創建了一個關於此的問題。

但是,代碼本身在pandas.io.formats.styler_render.py中包含一個_escape_latex(s)方法

def _escape_latex(s):
    r"""
    Replace the characters ``&``, ``%``, ``$``, ``#``, ``_``, ``{``, ``}``,
    ``~``, ``^``, and ``\`` in the string with LaTeX-safe sequences.

    Use this if you need to display text that might contain such characters in LaTeX.

    Parameters
    ----------
    s : str
        Input to be escaped

    Return
    ------
    str :
        Escaped string
    """
    return (
        s.replace("\\", "ab2§=§8yz")  # rare string for final conversion: avoid \\ clash
        .replace("ab2§=§8yz ", "ab2§=§8yz\\space ")  # since \backslash gobbles spaces
        .replace("&", "\\&")
        .replace("%", "\\%")
        .replace("$", "\\$")
        .replace("#", "\\#")
        .replace("_", "\\_")
        .replace("{", "\\{")
        .replace("}", "\\}")
        .replace("~ ", "~\\space ")  # since \textasciitilde gobbles spaces
        .replace("~", "\\textasciitilde ")
        .replace("^ ", "^\\space ")  # since \textasciicircum gobbles spaces
        .replace("^", "\\textasciicircum ")
        .replace("ab2§=§8yz", "\\textbackslash ")
    )

因此,最好的辦法是在對其進行任何樣式設置之前重新格式化輸入數據框並轉義索引名稱:

df.index.name = _escape_latex(df.index.name)
# then continue with your previous styling code

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM