2013-07-09 4 views
4

У меня есть DataFrame и хочу вывести его в pdf. В настоящее время я пытаюсь использовать ReportLab для этого, но, похоже, это не сработает. Я получаю сообщение об ошибке здесь:Pandas DataFrames в 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. Есть ли способ, чтобы сделать работу с ReportLab DataFrames?
  2. Если нет, то какой пакет я могу использовать для этой же цели?
+0

Значит, проблема не имеет ничего общего с pivot_table? Но это класс Table, что это? Можете ли вы привести простой пример DataFrame, который проявляет это поведение (работает ли он для 'df = pd.DataFrame ([[1, 2], [3, 4]])??) –

+0

К сожалению, это связано с DataFrame, а не pivot_table. Это не работает для вашего примера. –

+0

Возможно, имеет смысл использовать этот пример (это поможет, если мы сможем воссоздать ошибку) ... что такое переменные 'pivot_cols' и' column_order'? –

ответ

2

Py

Hallo,

Я также необходимости печатать в .pdf какой панды DataFrame организовать отчеты. Я попробовал ReportLab напрямую с df и имел объект AttributeError: DataFrame, который не имеет атрибута split. Я попытался с df.values ​​() и имел «TypeError: объект numpy.ndarray» не вызываемый ».

Когда близко бросить идею построить отчет в формате .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) 

Я действительно интересно читать о других возможных решений ..

Bye, Фабио.

+0

Спасибо за ваш ответ! Это не похоже на очень хороший способ обработки вещей, тем не менее, особенно для больших таблиц разного размера. Тем не менее, спасибо за вашу помощь. –

+0

Yep :-(.. Я полностью согласен .. но до сих пор я не был достаточно хорош, чтобы найти что-то лучше. Я новичок в этом, и я надеюсь, что у меня также есть предложение о том, как обрабатывать DataFrames в ReportLab ... о незавершенном элементе, относящемся к обертке строк, у меня был некоторый достойный результат str (df) .splitlines() в цикле for, чтобы нарисовать холст. By, Fabio. –

Смежные вопросы