应用pandas styler在latex中格式化 Dataframe 头

pinkon5k  于 2023-05-12  发布在  其他
关注(0)|答案(3)|浏览(103)

bounty还有4天到期。回答此问题可获得+50声望奖励。user3507584想要引起更多关注这个问题:使用pandas styler将数据框转换为Latex表时遇到了问题。需要帮助!:-/

我正在尝试获取以下表/ Dataframe 的latex文件:

df = pd.DataFrame(np.random.rand(10,2)*5,
                          index=pd.date_range(start="2021-01-01", periods=10),
                          columns=["Tokyo", "Beijing"])

df.index.names = ['date']
df.reset_index(inplace=True)

对于头部的样式,我尝试使用apply_index,如documentation所示:

def header_custom(v):
    return f"background-color: blue; color:black; font-weight:bold;"

styler = df.style.apply_index(header_custom,axis="columns")

with open('temp.tex','w') as file: 
    file.write(styler.to_latex(hrules=True,convert_css=True,column_format="p{30mm}|m|m|M|", multirow_align="c",multicol_align="c",clines='all;data'))

代码显示错误AttributeError: 'Series' object has no attribute 'columns',我不明白。它与to_latex()属性无关,因为即使删除所有这些属性也会保持相同的错误。有人知道如何使用样式器格式化标题吗?

p1tboqfb

p1tboqfb1#

一个可能的解决方案(缺少* len(v)):

df = pd.DataFrame(np.random.rand(10,2)*5,
                          index=pd.date_range(start="2021-01-01", periods=10),
                          columns=["Tokyo", "Beijing"])

df.index.names = ['date']
df.reset_index(inplace=True)

def header_custom(v):
    return ['background-color: blue; color:black; font-weight:bold;'] * len(v)

styler = df.style.apply_index(header_custom,axis="columns")

with open('temp.tex','w') as file: 
    file.write(styler.to_latex(hrules=True,convert_css=True,column_format="p{30mm}|m|m|M|", multirow_align="c",multicol_align="c",clines='all;data'))

输出:
tex文件:

\begin{tabular}{p{30mm}|m|m|M|}
\toprule
 & {\cellcolor{blue}} \color{black} \bfseries date & {\cellcolor{blue}} \color{black} \bfseries Tokyo & {\cellcolor{blue}} \color{black} \bfseries Beijing \\
\midrule
0 & 2021-01-01 00:00:00 & 3.081883 & 3.806137 \\
\cline{1-4}
1 & 2021-01-02 00:00:00 & 2.767482 & 2.179288 \\
\cline{1-4}
2 & 2021-01-03 00:00:00 & 2.895136 & 4.780432 \\
\cline{1-4}
3 & 2021-01-04 00:00:00 & 4.977341 & 4.668665 \\
\cline{1-4}
4 & 2021-01-05 00:00:00 & 2.310986 & 2.288097 \\
\cline{1-4}
5 & 2021-01-06 00:00:00 & 0.045837 & 0.096759 \\
\cline{1-4}
6 & 2021-01-07 00:00:00 & 4.482428 & 0.306380 \\
\cline{1-4}
7 & 2021-01-08 00:00:00 & 1.123099 & 3.476060 \\
\cline{1-4}
8 & 2021-01-09 00:00:00 & 4.720301 & 3.372799 \\
\cline{1-4}
9 & 2021-01-10 00:00:00 & 3.367175 & 2.213347 \\
\cline{1-4}
\bottomrule
\end{tabular}
pcrecxhr

pcrecxhr2#

使用pandas==1.5.3,我能够实现与PaulS相同的结果,使用官方文档中的一个示例使用的np.where方法,指定始终为True的条件。你能告诉我们你使用的是哪个版本的Pandas吗?

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.rand(10,2)*5,
                          index=pd.date_range(start="2021-01-01", periods=10),
                          columns=["Tokyo", "Beijing"])

df.index.names = ['date']
df.reset_index(inplace=True)

def color_b(s):

    formatting_condition = np.where(
        s == s, 
        f"background-color: blue; color:black; font-weight:bold;",
        ""
    )
    return formatting_condition

styler = df.style.apply_index(color_b, axis="columns")  

print(styler.to_latex(
    hrules=True,
    convert_css=True,
    column_format="p{30mm}|m|m|M|",
    multirow_align="c",
    multicol_align="c",
    clines='all;data'
    )
)
icnyk63a

icnyk63a3#

该函数是元素方面的:

def header_custom(v):
    return f"background-color: blue; color:black; font-weight:bold;"

您应该将其用于styler.map_index(以前的applymap_index)。
文档描述了不同方法之间的差异:

  • apply对数组进行顺序操作,并需要一个带有数组返回值的func。
  • map(applymap)按元素方式操作,并且需要具有单个值返回的func。

相关问题