2013-07-09 2 views
4

나는 DataFrame을 가지고 있으며이를 pdf로 출력하려고합니다. 나는 현재 이것을 위해 ReportLab을 사용하려고 노력하고 있지만 작동하지 않을 것입니다. 나는 여기에 오류가 :reportlab의 Pandas DataFrames

 mytable = Table(make_pivot_table(data, pivot_cols, column_order, 'criterion')) 

make_pivot_table은 팬더에게 pivot_table 함수를 사용하여 피벗 테이블을 반환합니다.

  1. DataFrames와 reportlab 작업을 할 수있는 방법이 있나요 : 내가 오류가
    ValueError: <[email protected] unknown rows x unknown cols>... invalid data type 
    

    내 질문

    은 무엇입니까?
  2. 그렇지 않은 경우 동일한 목적으로 어떤 패키지를 사용할 수 있습니까?
+0

문제는 pivot_table과 아무 관련이 없습니까? 하지만 그것은 Table 클래스입니다. 그게 뭐죠? 이 동작을 나타내는 DataFrame의 간단한 예제를 제공 할 수 있습니까 ('df = pdf.DataFrame ([[1, 2], [3, 4]))')?) –

+0

죄송합니다. pivot_table보다는 DataFrame입니다. 귀하의 예를 들어 작동하지 않습니다. –

+0

아마도이 예제를 대신 사용하는 것이 좋습니다 (오류를 다시 만들면 도움이 될 것입니다). 무엇이'pivot_cols' 및'column_order' 변수입니까? –

답변

2

Py를

안녕, 나 또한 보고서를 준비하는 일부 팬더 DataFrame .PDF로 인쇄 할 필요가있어

. 나는 ReportLab을 df로 직접 시도하고 "AttributeError : 'DataFrame'객체에 'split'속성이 없습니다." 나는 df.values ​​()로 시도하고 "TypeError : 'numpy.ndarray'객체를 호출 할 수 없습니다."

언제 STR (DF) 시도하고 나는 .PDF에서 어떤 결과가 ... :-) 코드는 보이는했다 .PDF 보고서를 구축하기 위해 아이디어를 종료에 가까운 같은 :

import pandas as pd 
from reportlab.pdfgen import canvas 
PATH_OUT = "C:\\" 
def pdf_df(c, testo, x, y): 
    c.drawAlignedString(x,y, testo) 
df = pd.DataFrame({'a':[3,4,5], 'b':[6,7,6],'c':[9,10,11]}) 
print df, type(df) 
print'' 
df1 = (df['a'].groupby([df['b'], df['a']])).sum() 
print df1, type(df1) 
print '' 
c = canvas.Canvas(PATH_OUT + 'out.pdf') 
pdf_df (c, str(df), 300, 500) 
pdf_df (c, str(df1), 300, 480) 
c.showPage() 
c.save() 

무엇 너 생각하니? 이게 합리적일까요? 아니면 더 똑똑한 방법이 있을까요?

이것은 매우 효과적이지 않은 것으로 보이고 처음에는 ReportLab에서 가져 오기를 기대했습니다. 그것은 ... 내가 .. 라인을 래핑하는 다음 몇 가지 방법이 필요 것과 크기가 변경됩니다

파비오

보인다

===== 지금 아래 솔루션의 많은 행복 해요

, 나는 위의 것에 대해서도 행복하지 않았다.

이것은 ReportLab 그리드를 기반으로하며 목록에서 작동합니다. 그래서 코드가 DF 다음 여기에

:-) ReportLab 그리드로 취급되는 목록으로 변환되어 그것이 :

from reportlab.lib.styles import getSampleStyleSheet 
from reportlab.platypus import * 
from reportlab.lib import colors 
import pandas as pd 
import random 

PATH_OUT = "C:\\" 

elements = [] 
styles = getSampleStyleSheet() 
doc = SimpleDocTemplate(PATH_OUT + 'Report_File.pdf') 
elements.append(Paragraph("Report Title", styles['Title'])) 

data = [[random.random() for i in range(1,4)] for j in range (1,8)] 
df = pd.DataFrame (data) 
lista = [df.columns[:,].values.astype(str).tolist()] + df.values.tolist() 

ts = [('ALIGN', (1,1), (-1,-1), 'CENTER'), 
    ('LINEABOVE', (0,0), (-1,0), 1, colors.purple), 
    ('LINEBELOW', (0,0), (-1,0), 1, colors.purple), 
    ('FONT', (0,0), (-1,0), 'Times-Bold'), 
    ('LINEABOVE', (0,-1), (-1,-1), 1, colors.purple), 
    ('LINEBELOW', (0,-1), (-1,-1), 0.5, colors.purple, 1, None, None, 4,1), 
    ('LINEBELOW', (0,-1), (-1,-1), 1, colors.red), 
    ('FONT', (0,-1), (-1,-1), 'Times-Bold'), 
    ('BACKGROUND',(1,1),(-2,-2),colors.green), 
    ('TEXTCOLOR',(0,0),(1,-1),colors.red)] 

table = Table(lista, style=ts) 
elements.append(table) 

doc.build(elements) 

나는 다른 가능한 솔루션에 대해 읽어 정말 관심이 있어요 ..

안녕, Fabio.

+0

답변 해 주셔서 감사합니다! 하지만 다양한 크기의 큰 테이블의 경우에는 아주 좋은 처리 방법이 아닙니다. 그럼에도 불구하고, 당신의 도움에 감사드립니다. –

+0

넵 :-(.. 나는 완전히 동의한다. 그러나 지금까지 나는 더 나은 것을 발견 할만큼 충분하지 못했다. 나는 이것에 익숙하지 않았고, 희망은 ReportLab 내에서 DataFrames를 다루는 방법에 대한 제안을하기위한 것이었다. ... 줄 바꿈에 관한 보류중인 항목에 대해 저는 for 루프에서 str (df) .splitlines()로 캔버스를 그리는 데 약간의 결과를 보았습니다. –