nbconvert multiindex dataframes to latex

时间:2014-09-08 23:12:58

标签: python pandas ipython ipython-notebook

我尝试使用ipython  nbconvert将多索引Pandas DataFrame导出到latex 但多索引行出错了。 我在代码的开头使用以下代码正确转换为乳胶(我发现它在某处,但不记得在哪里):

from sympy import latex
from IPython.display import HTML, Latex, display, Math
pd.set_option('display.notebook_repr_html', True)
def _repr_latex_(self):
    return "\\begin{center} %s \end{center}" % self.to_latex()
pd.DataFrame._repr_latex_ = _repr_latex_  # monkey patch pandas DataFrame

groupby代码相当大,但我也用较小的代码测试了它,如:

a = np.array([[1, 3, 4, 5],
             [1, 5, 36, 2],
             [3, 6, 23, 5],
             [2, 2, 1, 6],
             [2, 5, 1, 99]])
df = pd.DataFrame(a, columns=['A','B','C','D'])
df.groupby(by=['A','D']).sum()

结果是

    \begin{center} \begin{tabular}{lrr}
\toprule
{} &  B &   C \\
A D  &    &     \\
\midrule
1 2  &  5 &  36 \\
  5  &  3 &   4 \\
2 6  &  2 &   1 \\
  99 &  5 &   1 \\
3 5  &  6 &  23 \\
\bottomrule
\end{tabular}
 \end{center}

此示例仅显示第一个问题,此输出将显示多个索引堆叠在另一个之上,但我无法在输出之前找到格式化它的方法。 (我正在制作这种类型的许多大型桌子,因此在乳胶本身上制作会[并且是一种痛苦]。还有一些多索引,它完全不可读。第二个大问题是Ipython使用display()渲染这个表非常好地将列宽调整为屏幕,但是在latex上它会超出页面宽度并且大部分表都丢失了。

我已经搜遍了nbconvert的更好的格式化解决方案,但无法找到答案。如果你也有这个问题,或者你知道解决这两个问题,请告诉我。

pd:我使用的是python 2.7.7 Anaconda 2.0.1(64位)和最新版本的pandas(0.14.1)和ipython(2.2.0)。

2 个答案:

答案 0 :(得分:3)

我认为这是to_latex中的错误,res.T.to_latex()的结果也看起来不正确。

解决方法可能是修改索引:

In [11]: res = df.groupby(by=['A','D']).sum()

In [12]: res.index = res.index.map(lambda x: ' & '.join(map(str, x)))

In [13]: res.index.name = 'A & D'

In [14]: res.columns.values[0] = ' & ' + res.columns[0]

In [15]: print res.to_latex(escape=False)  # the whole point is not to escape the &s
\begin{tabular}{lrr}
\toprule
{} &   & B &   C \\
\midrule
A & D  &       &     \\
1 & 2  &     5 &  36 \\
1 & 5  &     3 &   4 \\
2 & 6  &     2 &   1 \\
2 & 99 &     5 &   1 \\
3 & 5  &     6 &  23 \\
\bottomrule
\end{tabular}

答案 1 :(得分:0)

奇怪。我今晚尝试了与.to_html()类似的东西,但却发现输出显示的是html而不是渲染它。它看起来与你的结果非常相似。

FWIW。在Mac上使用IPython 2.2,使用anaconda模块。