如何在为 Pandas Dataframe 对象添加样式后将其保存为 PDF?

5

我有一个数据框,并为其添加了样式以突出显示部分内容,等等,可以轻松地呈现为HTML,但是当尝试保存为PDF时,样式会丢失。有人有什么建议吗?

import pandas as pd
import numpy as np
np.random.seed(24)
df = pd.DataFrame({'A':np.linspace(1,10,10)})
df = pd.concat([df, pd.DataFrame(np.random.randn(10, 4), columns=list('BCDE'))], axis=1)
df.iloc[0, 2] = np.nan

def color_negative_red(val):
    """
    Takes a scalar and returns a string with
    the css property `'color: red'` for negative
    strings, black otherwise.
    """
    color = 'red' if val < 0 else 'black'
    return 'color: %s' % color

s = df.style.applymap(color_negative_red)

我现在想要把一个pandas.core.style.Styler对象中的DataFrame转换成PDF,并且保留所有格式(比如将负数标红)。有没有简便的方法来实现这一点,或者说Pandas中的样式机制还在开发中呢?


你在使用ipython/jupyter吗? - Merlin
@merlin,是的,我正在使用Jupyter笔记本实例来构建一个样式数据框函数的概念验证。 - Ajay Anand
我正在尝试保存这最后两个小时,似乎没有任何简单的方法(我也没有找到任何困难的方法)。可惜,我认为这个功能应该很容易添加,因为HTML原始代码应该在某个地方隐藏着。 - quapka
@quapka 感谢您的尝试,是的,我也尝试了从困难到简单的所有方法来将其导入可保存的格式,但无法弄清楚。目前我只能先截屏保存,相信这将来会成为一项可用的功能。再次感谢您的尝试! - Ajay Anand
我正在考虑自己写这个。最终的结果会是什么样子呢?如果有用的话,我会告诉你的。 - quapka
1个回答

0

这不是最好的解决方案,但它确实可以生成PDF文件

import pandas as pd
import numpy as np
np.random.seed(24)
df = pd.DataFrame({'A':np.linspace(1,10,10)})
df = pd.concat([df, pd.DataFrame(np.random.randn(10, 4), columns=list('BCDE'))], axis=1)
df.iloc[0, 2] = np.nan

def color_negative_red(val):
    """
    Takes a scalar and returns a string with
    the css property `'color: red'` for negative
    strings, black otherwise.
    """
    color = 'red' if val < 0 else 'black'
    return 'color: %s' % color

s = df.style.applymap(color_negative_red)

import pdfkit
import tempfile

options = {
    'page-size': 'Letter',
    'margin-top': '0.75in',
    'margin-right': '0.75in',
    'margin-bottom': '0.75in',
    'margin-left': '0.75in',
    'encoding': "UTF-8",
    'lowquality': False,
    'quiet':'',
    'custom-header' : [
        ('Accept-Encoding', 'gzip')
    ],
    'cookie': [
        ('cookie-name1', 'cookie-value1'),
        ('cookie-name2', 'cookie-value2'),
    ],
    'no-outline': None
}

tmp = tempfile.NamedTemporaryFile()
with open(tmp.name, 'w') as f:
    f.write(s._repr_html_())
with open(tmp.name, 'r') as f:
    pdfkit.from_file(f, "s.pdf",options=options)
f.close()


display(s)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接