【问题标题】:How to render pd.DataFrame table in pdf with nbconvert+pandoc如何使用 nbconvert+pandoc 在 pdf 中呈现 pd.DataFrame 表
【发布时间】:2020-06-30 08:58:12
【问题描述】:

我正在从一组 Jupyter 笔记本生成 pdf。对于每个 .ipynb 文件,我正在运行

$ jupyter-nbconvert --to markdown Untitled1.ipynb

然后将它们合并在一起:

$ pandoc Untitled1.md [Untitled2.md ...] -f gfm --pdf-engine=pdflatex -o all_notebooks.pdf

(我主要遵循示例here。)我注意到的一件事是pandas DataFrames,例如

import pandas as pd
df = pd.DataFrame({'a':[1,2,3]})
df.head()

在 pdf 中呈现为

而不是

您知道如何解决此问题吗?我正在使用$ jupyter-nbconvert --version 5.6.1$ pandoc --version 2.9.2.1。在md 文件中,表格变成了下面的html 块。我怀疑 pandoc 没有正确解释它。我尝试了from-markdown-strict 建议的here 选项,但没有任何运气。

谢谢!

<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>a</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1</td>
    </tr>
    <tr>
      <th>1</th>
      <td>2</td>
    </tr>
    <tr>
      <th>2</th>
      <td>3</td>
    </tr>
  </tbody>
</table>
</div>

【问题讨论】:

    标签: python pandas dataframe pdf pandoc


    【解决方案1】:

    这里的问题是 nbconvert 将 DataFrames 视为 HTML(加上您在输出中看到的样式,issue here),它会被 pandoc 的 Markdown 转换器忽略。

    解决此问题的一种方法是更改​​ pandas 的行为,使其不在笔记本中将 DataFrame 写为 HTML。您可以通过在每个笔记本顶部设置选项来做到这一点:

    pd.set_option("display.notebook_repr_html", False)
    

    另一种选择是使用 HTML 表示作为中间步骤而不是 Markdown:

    $ jupyter-nbconvert --to html Untitled1.ipynb
    $ pandoc Untitled1.html -t latex --pdf-engine=pdflatex -o all_notebooks.pdf
    

    当然,如果您不需要进行其他格式化,您可以直接将笔记本保存为 pdf:

    jupyter-nbconvert --to pdf Untitled1.ipynb
    

    (要合并多个笔记本,请参阅讨论here。)

    【讨论】:

      【解决方案2】:

      问题似乎出在 Jupyter 和 Pandoc 之间的连接上。 Jupyter 没有输出格式化的 Markdown,因此 pandoc 没有在 PDF 中格式化它。

      【讨论】:

        【解决方案3】:

        对我来说最好的方法是使用 ipypublish (https://ipypublish.readthedocs.io/en/latest/)

        安装

        conda install -c conda-forge ipypublish
        

        设置熊猫

        from ipypublish import nb_setup
        pd = nb_setup.setup_pandas(escape_latex = False)
        ...
        pd.DataFrame(mydata)
        

        利润

        jupyter nbconvert notebook.ipynb --no-input --no-prompt --to pdf
        

        确保在转换之前再次运行笔记本,以便所有表格都使用 ipypublish 呈现。然后它们在笔记本和 PDF 中看起来很酷。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-11-16
          • 1970-01-01
          • 1970-01-01
          • 2020-09-24
          • 1970-01-01
          • 2014-02-07
          • 2014-06-16
          相关资源
          最近更新 更多