如何使用 nbconvert+pandoc 渲染 pdf 中的 pd.DataFrame 表

use*_*414 7 python pdf dataframe pandoc pandas

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

$ jupyter-nbconvert --to markdown Untitled1.ipynb

然后将它们合并在一起:

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

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

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

在pdf中呈现为

pdf 中的数据框

而不是

在此输入图像描述

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

谢谢你!

<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>
Run Code Online (Sandbox Code Playgroud)

C. *_*aun 5

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

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

pd.set_option("display.notebook_repr_html", False)
Run Code Online (Sandbox Code Playgroud)

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

$ jupyter-nbconvert --to html Untitled1.ipynb
$ pandoc Untitled1.html -t latex --pdf-engine=pdflatex -o all_notebooks.pdf
Run Code Online (Sandbox Code Playgroud)

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

jupyter-nbconvert --to pdf Untitled1.ipynb
Run Code Online (Sandbox Code Playgroud)

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