2014-09-08 5 views
2

ipynthon의 nbconvert 을 사용하여 멀티 인덱스 팬더 데이터 프레임을 라텍스로 내보내려고 시도하고 있지만 멀티 인덱스 행이 모두 잘못되었습니다. 내가 제대로 라텍스로 변환하는 코드의 시작 부분에 다음 코드를 사용하고 (I 등등 곳을 찾았지만 위치를 기억 할 수 없음) :nbconvert multiindex 데이터 프레임을 라텍스로

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 코드가 꽤 큰하지만 난이 같은 작은 코드로 또한 테스트 : 이것의 결과는 본 실시 예는 단지 문제의 제 도시

\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} 

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() 

이다

이 출력을 보여줄 것이다 multiindex 다른 하나의 위에 쌓인,하지만 출력하기 전에 서식을 지정하는 방법을 찾을 수 없습니다. (나는이 종류의 많은 큰 테이블을 생산하고 있으므로 라텍스 자체를 형성하는 것은 고통이다). 또한 몇 가지 멀티 인덱스를 사용하면 완전히 읽을 수 없게됩니다. 두 번째 큰 문제는 Ipython이 display()를 사용하여이 테이블을 렌더링하고 실제로 열 너비를 화면에 맞게 조정하지만 라텍스에서는 페이지 너비를 초과하고 대부분의 테이블이 손실된다는 것입니다.

나는 nbconvert에 대한 더 나은 포매팅 솔루션을 찾고 있지만 모든 것을 찾을 수 없습니다. 제발 당신도이 문제가 있었거나이 두 가지 문제에 대한 해결책을 알고 있다면 제게 말해주십시오.

pd : Python 2.7.7 Anaconda 2.0.1 (64 비트) 및 최신 버전의 pandas (0.14.1) 및 ipython (2.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} 
+0

(현재 고정 된) 열 단위 동작에 대한 병합 된 PR이 있으며 인덱스 부분도 0.15로 고정 될 것입니다. https://github.com/pydata/pandas/pull/7982 –

+2

df.reset_index(). to_latex (index = False)도 합리적인 해결책이 될 수 있습니까? –

+0

@PaulH 확실히 쉬운 것! :) MI가 repr에 어떤 가치가 있는지 여부가 문제라고 생각합니다. –

0

이상한 :

해결 방법은 인덱스를 수정할 수 있습니다. 나는 오늘 밤 .to_html()과 비슷한 것을 시도했다. 단지 출력물이 HTML을 렌더링하는 것이 아니라 그것을 보여 주었다. 그것은 당신의 결과와 매우 비슷하게 보입니다.

FWIW. Mac에서 anaconda 모듈을 사용하여 IPython 2.2 사용.

+0

예, 꽤 정상입니다. Ipython 노트북을 사용하는 경우, display()를 사용할 때 기본 호출은 실수가 아니고 to render하는 to_html()입니다. 나는 to_something의 대부분이 파일 내보내기에 사용되기위한 것이라고 생각합니다. 어쨌든이 경우에는 문제가 아니었지만 새로운 표현으로 데이터를 구성하는 방식이었습니다. – BVJ