2013-07-09 45 views
4

我有一個DataFrame,並希望將其輸出爲pdf。我目前正在嘗試爲此使用ReportLab,但似乎不起作用。我在這裏得到一個錯誤:reportlab中的熊貓數據框

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

make_pivot_table只是用熊貓pivot_table函數返回一個數據透視表。 我得到的錯誤是

ValueError: <[email protected] unknown rows x unknown cols>... invalid data type 

我的問題是:

  1. 有沒有什麼辦法讓與DataFrames ReportLab的工作?
  2. 如果沒有,我可以使用什麼軟件包來達到同樣的目的?
+0

所以這個問題與pivot_table無關?但是這是Table類,那是什麼?你可以舉一個簡單的DataFrame的例子,它表現出這種行爲(它是否適用於'df = pd.DataFrame([[1,2],[3,4]])?) –

+0

對不起,是的, DataFrame而不是pivot_table。它不適用於你的例子。 –

+0

也許這是有道理的,而不是使用這個例子(這將有助於如果我們可以重新創建錯誤)......什麼是'pivot_cols'和'column_order'變量? –

回答

2

PY

喂,

我還需要打印爲.PDF一些熊貓據幀安排的報告。我直接用df嘗試了ReportLab,並且有一個「AttributeError:'DataFrame'對象沒有屬性'split'。」我試着用df.values()並且有「TypeError:'numpy.ndarray'對象不可調用」。

當接近跳槽的想法打造.PDF報告我試圖STR(DF)和我曾在一些.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) 

我真的很感興趣,瞭解其他可能的解決方案..

再見,法比奧。

+0

感謝您的回答!但它似乎不是一種處理事物的好方法,特別是對於大小不一的大型表格。儘管如此,感謝您的幫助。 –

+0

是的:(..我完全同意..但到目前爲止,我還沒有足夠好,以找到更好的..我是新來的,我希望也有一些建議,以及如何對待ReportFab中的DataFrames ...關於線條包裝的待定項目我在for循環中通過str(df).splitlines()獲得了一些體面的結果來繪製Canvas。 –